2013-05-10 49 views
2

我有兩個實體完全一樣的性質:如何在數據庫中存儲兩個相同的實體?實體框架,C#

public class Oil 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public int Price { get; set; } 
    public int Ammount { get; set; } 
} 

public class Filter 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public int Price { get; set; } 
    public int Ammount { get; set; } 
} 

問題:

1)我可以以某種方式將它們存儲在一個表中?如果是這樣,比如何?

2)或者我應該實現繼承?那麼什麼類型?

編輯:

在我的情況下,這兩個實體是一樣的,他們不會在未來任何不同的屬性。

我實現表每層次的方法,但還有另外一個問題
(我有一個有油的收集和過濾器另一種類型):

public class Warehouse 
{ 
    public Guid Id { get; set; } 
    public ICollection<Filter> Filters { get; set; } 
    public ICollection<Oil> Oils { get; set; } 
} 

所以,當我創建數據庫時,我得到Warehouse_IdWarehouse_Id1字段。我不希望Oil和Filter類在其中擁有Warehouse屬性,我如何才能在db表中爲倉庫ID獲取一個字段?

如果我在OilFilterBase類中包含WarehouseId作爲屬性,我將在數據庫表中獲得3個warehouse_id。

p.s.我也有DbSet<Oil>DbSet<Filter>在我的Context和沒有DbSet<OilFilterBase>

+0

試試這種方法公共類油:dbTable和公共類過濾器:dbTable繼承兩種類型構成一個dbType – HaBo 2013-05-10 23:04:11

回答

6

如果不瞭解更多關於您的要求,很難說最好。這兩個實體有什麼不同?如果他們執行不同的功能並且恰好具有相同的屬性,那麼將它們存儲在單獨的表中可能是一個好主意;這在概念上是最有意義的,如果你決定在將來想爲其中一個添加其他屬性,它會使事情變得更容易。另一方面,如果它們在每個級別上都是相同的,那麼也值得問問你是否真的需要兩種不同的實體類型來存儲它們。

對於中間地帶,其中兩類服務相關的目的,但也各不相同,在某些方面,那麼,某種形式的繼承可能是一個好辦法 - 要麼有一個實體類型從另一個派生,或創建一個新的共同的基本類型,並且具有兩個實體。

如果您決定這是最好的方法,那麼它看起來像是Table-per-Hierarchy映射的好候選者。你可以調整你的代碼是這樣的:

public abstract class OilFilterBase 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public int Price { get; set; } 
    public int Amount { get; set; } 
} 

public class Oil : OilFilterBase 
{ 
} 

public class Filter : OilFilterBase 
{ 
} 

...然後實體框架將在默認情況下,建立一個單一的表自動生成的鑑別列,並同時存儲實體類型的所有實例那張桌子。

如果您決定這些實體類型中的任何一個應該有其他字段,那麼您可以查看一些其他繼承選項,如Table-per-Type,這些選項爲每個實體類型創建單獨但相關的表。

首先要做的是決定如何將這些類從概念上融合在一起,然後找出以EF術語實現它的最佳方式。如果您可以提供更多關於這些實體是什麼以及它們如何工作的信息,那麼這裏的人們會更容易提供良好的建議。

迴應編輯:

我覺得做什麼用的額外列(Warehouse_IdWarehouse_Id1)發生的事情是這樣的:

因爲你設置爲OilFilter分開的關係,它不是假設你想使用基類的WarehouseId屬性作爲外鍵 - 如果你只是想建立關係爲Oil而不是Filter?在這種情況下,它不應該寫入基類列。所以,它決定創建新的屬性。

幸運的是,你可以使用[ForeignKey()]屬性(或流暢API)來告訴它你真正想要的,是這樣的:

using System.ComponentModel.DataAnnotations.Schema; 

public abstract class OilFilterBase 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public int Price { get; set; } 
    public int Amount { get; set; } 
    public Guid WarehouseId { get; set; } 
} 

public class Oil : OilFilterBase 
{ 
} 

public class Filter : OilFilterBase 
{ 
} 

public class Warehouse 
{ 
    public Guid Id { get; set; } 

    [ForeignKey("WarehouseId")] 
    public virtual ICollection<Filter> Filters { get; set; } 

    [ForeignKey("WarehouseId")] 
    public virtual ICollection<Oil> Oils { get; set; } 
} 

另外,我覺得將需要包括DbSet<OilFilterBase> (除了DbSet<Oil>DbSet<Filter>)在您的上下文中以獲得Table-per-Hierarchy繼承的功能 - 請嘗試並看看。

祝你好運!

+0

我更新了我的答案,你能檢查它嗎? – 2013-05-11 09:00:41

+0

好的,我添加了更多信息。希望能幫助到你! – 2013-05-11 15:47:30