2014-07-17 22 views
0

我們首先使用EF 6 Model開發了一個Web應用程序。這個模型的商業邏輯是在一個單獨的PCL項目中。是否有可能在使用本地數據庫的Xamarin.monotouch應用程序中使用編譯後的dll?如果是,如何?有沒有人知道關於這個問題的好文章?如果沒有,有沒有人知道這個問題的解決方法?在Webapp中共享EF 6.0 PCL,xamarin Monotouch IPAD?

我試過谷歌搜索,但沒有找到任何相關結果。

回答

2

有兩種情況 - 代碼優先或模型優先。兩者都歸結爲條件編譯。

代碼首先要容易得多:

  • 創建EF項目(√完成)

  • 創造一個導入相同的模型類編譯另一個(PCL)項目。製作您需要的PCL類型的其他項目。

  • 在PCL項目中添加一個編譯器符號。在Xamarin studio的項目選項/編譯/編譯器[Define Symbols]中找到它。添加一個新的符號,比如「PCL」

在您的EF代碼環繞所有不與

#if !PCL 
    public DbSet<Users> {...} 
#endif 

編譯您也可以添加代碼的項目,只會在顯示PCL或有替代性的定義:

#if !PCL 
    public ICollection<User> Users{get;set;} 
#endif 
#if PCL 
    public List<User> Users{get;set;} 
#endif 

困難得多的情況是機型第

  • 從數據庫中創建一個數據庫
  • 創建新項目與EF
  • 找到你的.edmx文件,並在其展開的一切。
  • 有兩個.tt文件--Model.Context.tt和Model.tt。在Model.tt你應該看到所有生成的.cs文件
  • 可選步驟:安裝自己T4 VS插件的代碼高亮在編輯.TT文件
  • T4 templates你能想到的剃刀或一些類似的模板技術在那裏。通過尋找生成的C#的關鍵字/類,如classusingnamespaceICollection
  • 您可以編輯該模板,只要你保存文件,將重新生成的.cs文件,熟悉的模板。我通常同時打開模板和生成的文件,因此我可以立即看到結果。
  • 在您的Model.tt中找到可以生成不能編譯或不需要它們的類型的地方。
  • 修改Model.tt,如下所述。
  • 創建你想要的目標設備
  • 關閉VS/XS設置一個新的PCL項目,複製EF項目中的新文件,用記事本打開它
  • 打開PCL項目,並複製它的頂部<PropertyGroup>,更換EF-copy項目的頂級房產組。有設置那裏,使項目PCL,包括<TargetFrameworkProfile>
  • 從新的PCL項目中複製<Import Project=...>標記爲EF-複製項目,以取代現有的
  • 在EF-複製項目中刪除任何東西的所有引用但.cs文件
  • 再次使用VS/XS打開解決方案,將複製的項目添加到解決方案並將PCL添加到其編譯器符號,更改其輸出位置或文件名以指示其PCL。我更改庫的名稱library.pcl.dll

T4代碼修改:在我自己的.TT我已經編輯身邊線50,其中產生的構造原來

if (collectionNavigationProperties.Any()){ 
     #> 
#if !PCL 
<# 
foreach (var navigationProperty in collectionNavigationProperties) 
{ 
#> 
    this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>(); 
<# } #> 
#endif 
<# 
} 

再繞線100,其中,類屬性生成

#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 

在.TT的NavigationProperty方法後我已經添加這樣的:

public string DeserializeNavigationProperty(NavigationProperty navigationProperty) 
{ 
    string navPropCode = NavigationProperty(navigationProperty); 
    navPropCode = navPropCode.Replace("ICollection","List"); 
    return navPropCode; 
} 

更換ICollectionList方式,我有一個具體的類型反序列化到。

+0

Thnx爲您的迴應! +1除了我們已經使用模型的第一種方法..它仍然可以這樣做嗎? –

+1

@MarkRijsmus在這裏你去所有的信息 –

+0

Thnx,我們會試試這個。我給你儘可能多的分數,因爲我可能會給。 Thnx花時間回答我的問題!問候。 –