如何在数据库中存储两个相同的实体?实体框架,c#

本文关键字:实体 框架 两个 数据库 存储 | 更新日期: 2023-09-27 18:13:00

我有两个具有完全相同属性的实体:

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字段在它。我不希望油和过滤器类有Warehouse属性在他们,我怎么能得到只有一个字段的仓库id在数据库表?

如果我在OilFilterBase类中包含WarehouseId作为属性,我将在数据库表中获得3个warehouse_id。

注。我也有DbSet<Oil>DbSet<Filter>在我的Context和没有DbSet<OilFilterBase>

如何在数据库中存储两个相同的实体?实体框架,c#

如果不了解您的需求,很难说什么是最好的。是什么让这两个实体不同?如果它们执行不同的功能,恰好具有相同的属性,那么将它们存储在单独的表中可能是一个好主意;这在概念上是最有意义的,并且如果您决定将来向其中一个添加额外的属性,它将使事情变得容易得多。

另一方面,如果它们在每个级别上都是相同的,那么也值得问一下是否真的需要两种不同的实体类型来存储它们。

对于中间地带,两个类服务于相关的目的,但在某些方面也有所不同,那么是的,某种形式的继承可能是一种好方法——要么让一个实体类型从另一个实体类型派生,要么创建一个新的公共基类型,让两个实体都从它派生。

如果您认为这是最好的方法,那么它看起来是表-层次映射的一个很好的候选。你可以这样重构你的代码:

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
{
}

…然后,在默认情况下,实体框架将创建一个带有自动生成的discriminator列的表,并将两种实体类型的所有实例存储在该表中。

如果您决定这些实体类型中的任何一个都应该有额外的字段,那么您可以查看一些其他继承选项,如Table-per-Type,为每个实体类型创建单独但相关的表。

首先要做的是决定这些类如何在概念上组合在一起,然后找出在EF术语中实现它的最佳方法。如果你能提供更多关于这些实体是什么以及它们是如何工作的信息,这里的人会更容易给出好的建议。

对编辑的回应:

我认为额外的列(Warehouse_IdWarehouse_Id1)是这样的:

因为您分别为OilFilter设置了关系,假设您想使用基类的WarehouseId属性作为外键是不舒服的——如果您只想为Oil而不是Filter设置该关系该怎么办?在这种情况下,它不应该写入基类列。因此,它决定创建新的属性。

幸运的是,您可以使用[ForeignKey()]属性(或fluent 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>),以便使每层次表继承工作-尝试它,看看。

祝你好运!