簡體   English   中英

在Webapp,xamarin Monotouch IPAD中共享EF 6.0 PCL?

[英]Sharing EF 6.0 PCL in Webapp, xamarin Monotouch IPAD?

我們首先使用EF 6模型開發了一個Web應用程序。 此模型及其業務邏輯位於單獨的PCL項目中。 是否可以在使用本地DB的Xamarin.monotouch應用程序中使用編譯的dll? 如果是,怎么辦? 有誰知道關於這個主題的好文章? 如果不是,是否有人知道此問題的解決方法?

我嘗試了Google搜索,但未找到任何相關結果。

有兩種方案-代碼優先或模型優先。 兩者都歸結為條件編譯。

代碼優先要容易得多:

  • 創建您的EF項目(√完成)

  • 創建另一個(PCL)項目,在其中導入相同的模型類進行編譯。 制作您需要的其他PCL類型的項目。

  • 在PCL項目中,添加一個編譯器符號。 在Xamarin Studio的項目options / build / compiler [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

更困難的情況是Model First

  • 建立資料庫
  • 從數據庫中使用EF創建一個新項目
  • 找到您的.edmx文件並展開其下的所有內容。
  • 有兩個.tt文件-Model.Context.tt和Model.tt。 在Model.tt下,您應該看到所有生成的.cs文件
  • 可選步驟:安裝T4 VS插件,以在編輯.tt文件時突出顯示代碼
  • 您可以將T4模板視為Razor或其中的一些類似模板技術。 通過查找生成的C#關鍵字/類(例如classusingnamespaceICollection using熟悉模板
  • 您可以編輯模板,並且一旦保存文件,它將重新生成.cs文件。 我通常同時打開模板和生成的文件,因此我可以立即看到結果。
  • 在Model.tt中找到可以生成無法編譯或不是所需類型的對象的位置。
  • 如下所述修改Model.tt。
  • 使用所需的目標設備設置創建一個新的PCL項目
  • 關閉VS / XS,將EF項目復制到新文件,然后使用記事本打開
  • 打開PCL項目並復制它的頂部<PropertyGroup> ,用它替換EF-copy項目的頂部屬性組。 那里有使項目成為PCL的設置,包括<TargetFrameworkProfile>
  • <Import Project=...>標簽從新的PCL項目復制到EF-copy項目中,替換現有的
  • 在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;
}

List方式替換ICollection ,我有一個反序列化的具體類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM