2014-07-17 4 views
0

Nous avons d'abord développé une application web en utilisant EF 6 Model. Ce modèle avec son businesslogic est dans un projet PCL séparé. Est-il possible d'utiliser la DLL compilée dans une application Xamarin.monotouch en utilisant une base de données locale? Si oui, comment? Est-ce que quelqu'un sait un bon article sur ce sujet? Si non, quelqu'un sait-il une solution de contournement pour cette question?Partage EF 6.0 PCL dans Webapp, xamarin Monotouch IPAD?

J'ai essayé une recherche google mais je n'ai trouvé aucun résultat pertinent.

Répondre

2

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.

+0

Thnx pour votre réponse! +1 Sauf que nous utilisons la première approche du modèle. Peut-on encore faire comme ça? –

+1

@MarkRijsmus ici vous allez –

+0

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. –

Questions connexes