我有两个具有完全相同属性的实体:
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_Id
和Warehouse_Id1
个字段。我不希望Oil和Filter类中包含Warehouse
属性,如何在db表中只获取Warehouse id的一个字段?
如果我将WarehouseId作为OilFilterBase类中的属性包含在内,我将在数据库表中获得3个warehouse_id。
p.s。我的DbSet<Oil>
中还有DbSet<Filter>
和Context
,但没有DbSet<OilFilterBase>
。
答案 0 :(得分: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_Id
和Warehouse_Id1
)发生的事情是这样的:
因为您正在分别设置Oil
和Filter
的关系,所以假设您想要使用基类的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>
)才能获得表格-per-Hierarchy继承工作 - 尝试并查看。