实体框架代码优先 - 来自多个表的一对多关系

时间:2016-03-21 10:59:34

标签: sql-server entity-framework ef-code-first

我有一个BlobEntity表,其中包含我的应用程序中许多其他表(tableX,tableY,tableZ等等)的文件路径。

BlobEntity表中所有其他表之间的关系是一对多。

示例:

tableX - > BlobTable(OTM)

tableY - > BlobTable(OTM)

tableZ - > BlobTable(OTM)

,关系是:

public virtual ICollection<BlobEntity> BlobEntity { get; set; }

我不确定这是否是一个问题,但实体框架Code First在BlobEntity表中为每个源表创建一个新的FK列。

就我而言,BlobEntity包含三个用于tableX,tableY和tableZ的FK列。

为了提高效率,我宁愿在BlobEntity中创建一个包含源表的FK的列。

合理吗?

请告知......

感谢。

1 个答案:

答案 0 :(得分:2)

不,即使在普通的旧SQL中也无法做到这一点。 你可以有一个指向多个表的foreing键;这就是你需要的原因 三栏。

如果你想做这样的“技巧”,你必须手动管理关系(我的意思是,没有真正的FK),但你不能将它映射到EF。

这个怎么样?

public class EntityA
{
    public int Id { get; set; }

    public int MyFileID {get;set;}
    public virtual MyFiles MyFile { get; set; }
}

public class EntityB
{
    public int Id { get; set; }

    public int MyFileID {get;set;}
    public virtual MyFiles MyFile { get; set; }
}

public class MyFiles
{
    public MyFiles()
    {
        // ReSharper disable once VirtualMemberCallInContructor
        FilesForEntityA = new List<EntityA>();
        // ReSharper disable once VirtualMemberCallInContructor
        FilesForEntityB = new List<EntityB>();
    }


    public int Id { get; set; }

    public int? EntityAId {get;set;}
    public int? EntityBId {get;set;}

    public virtual ICollection<EntityA> FilesForEntityA { get; set; }
    public virtual ICollection<EntityB> FilesForEntityB { get; set; }
}

通过这种方式,您可以使用FK,并且可以轻松管理多个实体。 显然,如果每个实体都有许多文件,则可以采用N对N关系,例如this