Entity framework 如何为多个实体建模以引用单个表中的同类集合

Entity framework 如何为多个实体建模以引用单个表中的同类集合,entity-framework,entity-framework-6,code-first,ef-fluent-api,Entity Framework,Entity Framework 6,Code First,Ef Fluent Api,我对EF不是很有经验,我试图找出创建实体的正确方法或选项,这些实体的集合可以包含在其他实体(不同的表)中。 假设我有三个现有的类(ModuleA、ModuleB、ModuleD),我想包含它自己的数据实体集合。 我想为数据实体创建一个表,但我不喜欢为每个FK创建三个可为null的Guid列。 这也给了我应用迁移时的错误(“…可能会导致循环或多个级联路径”)——这可能通过删除级联删除和手动删除数据来解决,但我不喜欢这种想法 我最想要的是FKs到所有三个模块的数据上的单一(共享)Guid属性,这是不

我对EF不是很有经验,我试图找出创建实体的正确方法或选项,这些实体的集合可以包含在其他实体(不同的表)中。 假设我有三个现有的类(ModuleA、ModuleB、ModuleD),我想包含它自己的数据实体集合。 我想为数据实体创建一个表,但我不喜欢为每个FK创建三个可为null的Guid列。 这也给了我应用迁移时的错误(“…可能会导致循环或多个级联路径”)——这可能通过删除级联删除和手动删除数据来解决,但我不喜欢这种想法

我最想要的是FKs到所有三个模块的数据上的单一(共享)Guid属性,这是不可能的,至少在所有三个主表中同时存在相同ID的情况下是不可能的(因为它在DB中创建了三个FKs)

类数据
{
公共int Id{get;set;}
公共字节[]值{get;set;}
}
类模
{
公共Guid Id{get;set;}
公共ICollection数据{get;set;}
//其他一些东西。。。
}
类模B
{
公共Guid Id{get;set;}
公共ICollection数据{get;set;}
// ...
}
类模
{
公共Guid Id{get;set;}
公共ICollection数据{get;set;}
//其他一些不同的东西。。。
}

您可以创建3个模块到数据多对多表,如下所示:

class Data
{
    public int Id {get; set;}
    public byte[] Values {get; set;}

}

class ModuleAData 
{
    public ModuleAId {get; set;}
    public DataId {get; set;}
}

class ModuleA
{
    public Guid Id {get; set;}
    public ICollection<ModuleAData> Data {get; set;}
    // some other stuff...  
}
类数据
{
公共int Id{get;set;}
公共字节[]值{get;set;}
}
类模块数据
{
公共模块ID{get;set;}
公共数据标识{get;set;}
}
类模
{
公共Guid Id{get;set;}
公共ICollection数据{get;set;}
//其他一些东西。。。
}

谢谢shibormot,但为了在一个表中包含数据,还需要3个表。然后我宁愿使用3个数据表,在末尾使用4个而不是7个。这种方法还有其他好处吗?我认为这种模型的数据操作不是很简单,一个好处是可以在不同的模块中使用相同的数据。其他:如果数据对所有模块都具有相同的含义,那么在客户端上,您可以使用单个逻辑(一些读写值的类)对其进行恶意填充,而无需为不同的模块重载此逻辑,因为它将是3个类,您将需要3个重载。如果db和您的.net逻辑始终是耦合的,那么这不是问题。如果逻辑简单,这也不是问题。但如果有人决定在没有简单重载(sql?)的语言上使用4表结构和复杂的数据逻辑重写客户机。不知道你的应用程序)
class Data
{
    public int Id {get; set;}
    public byte[] Values {get; set;}

}

class ModuleAData 
{
    public ModuleAId {get; set;}
    public DataId {get; set;}
}

class ModuleA
{
    public Guid Id {get; set;}
    public ICollection<ModuleAData> Data {get; set;}
    // some other stuff...  
}