2

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

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属性,我怎样才能在 db 表中只获取一个 Warehouse id 字段?

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

ps我也有DbSet<Oil>andDbSet<Filter>在我的Context和没有DbSet<OilFilterBase>.

4

1 回答 1

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

...然后,默认情况下,Entity Framework 将创建一个带有自动生成的鉴别器列的表,并将这两种实体类型的所有实例都存储在该表中。

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

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

对编辑的回应:

我认为额外的列(Warehouse_IdWarehouse_Id1)发生了什么是这样的:

Oil因为您正在为和单独设置关系Filter,所以假设您想使用基类的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>and DbSet<Filter>),以便让每层次表继承工作 - 试试看。

祝你好运!

于 2013-05-11T01:33:11.133 回答