Ale*_*voi 2 c# database inheritance entity-framework
我有两个具有完全相同属性的实体:
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; }
}
Run Code Online (Sandbox Code Playgroud)
问题:
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; }
}
Run Code Online (Sandbox Code Playgroud)
所以,当我创建数据库时,我得到Warehouse_Id并Warehouse_Id1在其领域.我不希望Oil和Filter类中包含Warehouse属性,如何在db表中只获取Warehouse id的一个字段?
如果我将WarehouseId作为OilFilterBase类中的属性包含在内,我将在数据库表中获得3个warehouse_id.
ps我也有DbSet<Oil>,DbSet<Filter>在我Context和没有DbSet<OilFilterBase>.
如果不了解更多有关您的要求,很难说什么是最好的.是什么让这两个实体不同?如果它们执行不同的功能并恰好具有相同的属性,那么将它们存储在单独的表中可能是个好主意; 这在概念上是最有意义的,如果您决定在将来为其中一个添加其他属性,它会使事情变得更容易.
另一方面,如果它们在每个级别上都是相同的,那么您是否真的需要两种不同的实体类型来存储它们也是值得的.
对于两个类用于相关目的但在某些方面也有所不同的中间地带,那么是的,某种形式的继承可能是一种好的方法 - 要么有一个实体类型派生自另一个,要么创建一个新的公共基类型和两个实体都来自那个.
如果您认为这是最好的方法,那么它看起来像是每层次结构映射的一个很好的候选者.您可以重构您的代码,如下所示:
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
{
}
Run Code Online (Sandbox Code Playgroud)
...然后,实体框架将默认创建一个带有自动生成的鉴别器列的表,并将该实体类型的所有实例存储在该表中.
如果您确定这些实体类型中的任何一个应该具有其他字段,那么您可以查看一些其他继承选项,如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; }
}
Run Code Online (Sandbox Code Playgroud)
另外,我认为你需要在你的上下文中包含一个DbSet<OilFilterBase>(除了DbSet<Oil>和之外DbSet<Filter>)以使每个层次结构的表继承有效 - 试试看.
祝好运!