2017-06-01 75 views
0

在實體框架6代碼中,我可以向我的C#對象模型中添加哪些屬性以用於1-1父/子關係而底層的SQL表關係是1到多?在EF6中,如何在1到多個SQL表關係的頂部關聯1#關係的c#模型

數據在SQL Server中爲特定客戶通用於所有的客戶數據和數據之間的分割2012

它有三個實體,一個WarehouseBase基礎機構,WarehouseCustom客戶特定數據和客戶的實體。

C#的對象:

Warehouse 
{ 
    public Guid ID {get;set;} 
    public string Name {get;set;} 
    public string Note {get;set;} //customer specific data 
} 

Customer 
{ 
    public Guid ID {get;set;} 
    public string Name {get;set;} 
} 

客戶用戶可以使用這個工作流程:

  1. 客戶在瀏覽器中查看倉庫XYZ。它應該返回倉庫XYZ共享數據(ID,名稱)和客戶特定數據(注)。
  2. 客戶編輯說明,並點擊保存按鈕
  3. 注意應保存到數據庫

的管理員將編輯並保存WarehouseBase數據(名稱),而不是客戶的具體數據。

SQL表:

WarehouseBase 
    ID : Guid 
    Name: Nvarchar (255) 

WarehouseCustom 
    ID : Guid 
    WarehouseBaseID: GUID 
    CustomerID : GUID 
    Note : Nvarchar (255) 

Customer 
    ID : Guid 
    Name : Nvarchar (255) 

該系統具有使用Web瀏覽器前端連接到服務器的WebAPI多個不同的併發用戶。服務器使用EF6/C#來訪問SQL Server。

可以爲此C#模型添加哪些屬性?

已經看到:

  1. 一對多的關係:http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx
  2. 如何查詢一對多和加載特定的子數據:Entity Framework include filter child collection
+0

我們的應用程序將有50多種這些類型的基礎/自定義實體;所以避免爲每個實體手動編碼2個查詢加載和1個查詢保存會有所幫助。 – testx

+0

對於新客戶,備註的子對象可能不存在。 – testx

+0

用戶將首先通過倉庫名稱(基本實體數據)進行搜索以查找並加載倉庫名稱。通過倉庫記錄首先進行搜索或鏈接表比添加2個查詢來讀取倉庫和1個查詢來更新倉庫註釋增加了更多的複雜性。 – testx

回答

0

的C#應該是

Warehouse { 
    public Guid ID {get;set;} 
    public string Name {get;set;} 

    public ICollection<WarehouseCustom> CustomersNotes {get; set;} 
} 

Customer { 
    public Guid ID {get;set;} 
    public string Name {get;set;} 

    public ICollection<WarehouseCustom> WarehouseNotes {get; set;} 
} 

WarehouseCustom { 
    public Guid ID {get;set;} 
    public string Note {get;set;} //customer specific data 

    public virtual Warehouse {get; set;} 
    public virtual Customer {get; set;} 
} 

因此,一位顧客可以在戰爭中訪問他的所有筆記倉庫和倉庫管理員可以訪問倉庫中的所有註釋。

爲了防止客戶在倉庫的客戶備註中導航,您必須注意實現數據。

using (AppContext ctx = new AppContext()) { 
    return ctx.Customers. 
     Include(x => x.WarehouseNotes.Select(y => y.Wharehouse)). 
     Where(x => x.ID == oneID). 
     ToList(); 
} 

即:不要使用懶惰加載。

在代碼示例中,您只能加載客戶應該看到的內容。

理想情況下tou應該使用DTO類型。

順便說一句:您不需要倉庫自定義ID(如果您可以爲一個倉庫創建多個客戶註釋,則需要輸入ID)。您可以使用由倉庫編號和客戶編號組成的複雜關鍵字。

恕我直言,這最後一個約束將強制你命名1對1的關係。

+0

如果客戶有倉庫備註但不適用於客戶的情況想要找到沒有備註的倉庫,然後向倉庫添加備註。 – testx

+0

謝謝tschmit007 – testx