我有两个具有完全相同属性的实体:
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) 或者我应该实现继承?那是什么类型的呢?
编辑:
在我的例子中,这两个实体是一样的,它们将来不会有任何不同的属性。
我实现了 Table-per-Hierarchy 方法,但还有另一个问题
(我有另一种收集油和过滤器的类型):
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
它们中的属性,我怎样才能在数据库表中只获得一个字段用于仓库 ID?
如果我将 WarehouseId 作为属性包含在 OilFilterBase 类中,我将在数据库表中获得 3 个 warehouse_id。
附注我还有DbSet<Oil>
和 DbSet<Filter>
在我的 Context
并且没有 DbSet<OilFilterBase>
.
最佳答案
如果不进一步了解您的要求,很难说什么是最好的。是什么让这两个实体不同?如果它们执行不同的功能并且恰好具有相同的属性,那么将它们存储在单独的表中可能是个好主意;这在概念上最有意义,并且如果您决定将来要向其中一个属性添加其他属性,这将使事情变得容易得多。
另一方面,如果它们在每个级别都相同,那么也值得一问您是否真的需要两种不同的实体类型来存储它们。
对于两个类服务于相关目的但在某些方面也有所不同的中间立场,那么是的,某种形式的继承可能是一种很好的方法——要么让一个实体类型派生自另一个实体类型,要么创建一个新的公共(public)实体类型基本类型并让两个实体都从中派生。
如果您认为这是最好的方法,那么它看起来很适合 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
{
}
...然后, Entity Framework 将默认创建一个包含自动生成的鉴别器列的表,并将两种实体类型的所有实例存储在该表中。
如果您决定这些实体类型中的任何一个都应该有额外的字段,那么您可以查看其他一些继承选项,例如 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>
之外)在您的上下文中,以便让 Table-per-Hierarchy 继承发挥作用——试试看。
祝你好运!
关于c# - 如何在数据库中存储两个相同的实体? Entity Framework ,C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16491882/