c# - 如何在数据库中存储两个相同的实体? Entity Framework ,C#

标签 c# database entity-framework inheritance

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

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_IdWarehouse_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_IdWarehouse_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/

相关文章:

sql - 您将如何在 Microsoft SQL Server 中实现序列?

entity-framework - Entity Framework ObjectContext 是否正确实现了工作单元模式?

c# - EntityFramework 抛出 NullReferenceException

c# - AffectedRows 在 FormView 的 ItemInserted 中总是 -1

c# - 按 Entity Framework 中子列表的第一项对集合进行排序

c# - 无法在 Windows 应用商店应用程序中删除 Sqlite 数据库中的记录

java - Android应用程序的多语言支持

c# - 如何在 C# MVC 中创建引用另一个模型两次的代码优先模型?

c# - 我们可以对结构布局做出假设吗?

c# - 帮助C#程序设计实现: multiple array of lists or a better way?