Il existe deux scénarios: le code d'abord ou le modèle d'abord. Les deux se résument à une compilation conditionnelle.
premier code est beaucoup plus facile:
Créer votre projet EF (√ fait)
Créer un autre projet (PCL) où vous importez les mêmes classes de modèle pour la compilation. Faites cet autre projet du type PCL dont vous avez besoin.
Dans le projet PCL, ajoutez un symbole de compilateur. Trouvez-le dans les options/build/compiler du projet [Define Symbols] dans le studio Xamarin. Ajouter un nouveau symbole, tel que « PCL »
Dans votre code EF Surround tous les éléments qui ne compilent pas avec
#if !PCL
public DbSet<Users> {...}
#endif
Vous pouvez également ajouter du code qui ne ferait apparaître dans le PCL ou ont d'autres définitions:
#if !PCL
public ICollection<User> Users{get;set;}
#endif
#if PCL
public List<User> Users{get;set;}
#endif
Le scénario est beaucoup plus difficile Modèle Première:
- Créer une base de données
- Créer un nouveau projet avec EF à partir de votre base de données
- Trouver votre fichier .edmx et tout se dilatent sous elle.
- Il existe deux fichiers .tt - Model.Context.tt et Model.tt. Sous Model.tt vous devriez voir tous les fichiers générés .cs
- Etape facultative: Installez-vous un Addin VS T4 pour le code mettant en évidence lors de l'édition des fichiers .tt
- T4 templates vous pouvez penser comme un rasoir ou certaines des techniques de matriçage similaires là-bas. Familiarisez-vous avec le modèle en recherchant des mots-clés C# générés/classes telles que
class
ou using
ou namespace
ou ICollection
- Vous pouvez modifier le modèle et dès que vous enregistrez le fichier, il régénérera les fichiers .cs. J'ai généralement le modèle et un fichier généré côte à côte pour que je puisse voir le résultat immédiatement.
- trouver les endroits dans votre Model.tt qui génèrent des choses qui ne compilent pas ou ne sont pas du type que vous avez besoin d'être.
- Modifiez Model.tt comme décrit ci-dessous.
- Créer un nouveau projet PCL avec les paramètres que vous souhaitez pour les périphériques cibles
- Fermer VS/XS, copie du projet EF un nouveau fichier et l'ouvrir avec notepad
- Ouvrez le projet PCL et le copier est supérieure
<PropertyGroup>
, remplacer le meilleur groupe de propriétés du projet EF-copy avec ça. Il y a des paramètres là qui font le projet d'un PCL, y compris <TargetFrameworkProfile>
- copie l'étiquette
<Import Project=...>
du nouveau projet PCL dans le projet EF-copie, remplaçant l'existant
- Dans le projet EF-copie supprimer toutes les références à quoi que ce soit mais les fichiers .cs
- Ouvrez à nouveau la solution avec VS/XS, ajoutez le projet copié à la solution et ajoutez PCL à ses symboles de compilateur, modifiez son emplacement de sortie ou son nom de fichier pour indiquer qu'il s'agit de PCL. Je change le nom de la bibliothèque à library.pcl.dll
code T4 Modification: Dans mon .tt j'ai modifié l'original autour de la ligne 50, où le constructeur est généré
if (collectionNavigationProperties.Any()){
#>
#if !PCL
<#
foreach (var navigationProperty in collectionNavigationProperties)
{
#>
this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();
<# } #>
#endif
<#
}
puis autour de la ligne 100, où les propriétés de classe sont générés
#if !PCL
<# // this looks like the original .tt
foreach (var navigationProperty in navigationProperties)
{
#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#
}
#>
#endif
#if PCL
<# // and this is the copy I've added. Notice it calls a different method, see below
foreach (var navigationProperty in navigationProperties)
{
#>
<#=codeStringGenerator.DeserializeNavigationProperty(navigationProperty)#>
<#
}
#>
#endif
Après la méthode NavigationProperty
dans le .tt J'ai ajouté ceci:
public string DeserializeNavigationProperty(NavigationProperty navigationProperty)
{
string navPropCode = NavigationProperty(navigationProperty);
navPropCode = navPropCode.Replace("ICollection","List");
return navPropCode;
}
remplaçant le ICollection
avec List
façon dont j'ai un type concret de désérialiser dans.
Thnx pour votre réponse! +1 Sauf que nous utilisons la première approche du modèle. Peut-on encore faire comme ça? –
@MarkRijsmus ici vous allez –
Thnx pour toutes les informations, nous allons essayer cela. Je vous ai donné autant de points que possible. Merci d'avoir pris le temps de répondre à ma question! Salutations. –