Entity framework 可以在一个表列中保留多个关系吗?

Entity framework 可以在一个表列中保留多个关系吗?,entity-framework,entity-relationship,Entity Framework,Entity Relationship,我首先使用实体框架代码,我遇到了问题,因为EF创建了带有两个引用键的事件表,一个用于classObjectOne,另一个用于classObjectTwo 是否可以在一列Event.ObjectId中保留Id值,并在属性Event.type中保留关系类型 我可以进行以下映射(其中FK只有一列)。是否可以不在数据库中创建FK,因为现在我必须添加ObjectOne表和ObjectTwo表中存在的值,而这不是我的解决方案): modelBuilder.Entity() .HasMany(c=>c.Eve

我首先使用实体框架代码,我遇到了问题,因为EF创建了带有两个引用键的
事件
表,一个用于class
ObjectOne
,另一个用于class
ObjectTwo

是否可以在一列
Event.ObjectId
中保留Id值,并在属性
Event.type
中保留关系类型

我可以进行以下映射(其中FK只有一列)。是否可以不在数据库中创建FK,因为现在我必须添加
ObjectOne
表和
ObjectTwo
表中存在的值,而这不是我的解决方案):

modelBuilder.Entity()
.HasMany(c=>c.Events).WithOptional().HasForeignKey(x=>x.ObjectId);
modelBuilder.Entity()
.HasMany(c=>c.Events).WithOptional().HasForeignKey(x=>x.ObjectId);
示例类:

 public class ObjectOne
{
    public int ObjectOneId { get; set; }
    public ICollection<Event> Events { get; set; }
}

public class ObjectTwo
{
    public int ObjectTwoId { get; set; }
    public ICollection<Event> Events { get; set; }
}


public class Event
{
    public int EventId { get; set; }
    public int ObjectId { get; set; }
    public string Type { get; set; }
}

public class AddEvent : Event
{
}

public class Updated : Event
{
}
公共类ObjectOne
{
public int ObjectOneId{get;set;}
公共ICollection事件{get;set;}
}
公共类对象2
{
public int ObjectTwoId{get;set;}
公共ICollection事件{get;set;}
}
公开课活动
{
public int EventId{get;set;}
public int ObjectId{get;set;}
公共字符串类型{get;set;}
}
公共类事件:事件
{
}
公共课更新:活动
{
}
提前感谢

这种多态性关联通常被认为是一种反模式,参见比尔·卡温的。然而,在某些情况下,他们可能会不可避免(或者太实际而无法保持清教徒)。如果您仍然想使用它们,Bill Karwin非常乐意推荐一个实现。你应该阅读这本书了解所有的细节,但问题的核心是这个图表:

(其中Comment具有事件表的角色,不要与图中的事件表混淆!!)

在基表中,收集与
事件
关联的表的所有主键


有了实体框架,另一种方法是可能的(尽管对于您希望容纳的表的数量来说并不可行):您可以在
OneEvent
TwoEvent
等中对
Event
进行子类化,其中
Type
是鉴别器,并将
ObjectOne
OneEvent
关联,
ObjectTwo
带有
TwoEvent
s等。

使用一列引用一次
TableOne
和另一次
TableTwo
是一个非常糟糕的主意。不要这样做。有两个单独的、聚焦的FK列有什么不对?这是一个更干净的设计,这种方式-你可以有实际的引用完整性(这是你不能用其他方法做的)…呵呵,我知道这看起来很糟糕,但我在一家公司的源代码中看到了类似的东西,他们在nHibernate中制作,我很好奇是否可以用EF配置它。我认为他们使用这个解决方案是因为他们有一个事件表和大约100多个与此事件表相关的对象,现在你必须选择100个FK键或2列?老实说,在这种情况下,我真的不知道好的解决方案,也许你可以提出一些建议?在这种情况下,你需要有两个列/属性,但你不能建立任何关系-既不能在数据库级别,也不能在EF中(因为FK列可以引用100个表中的任何一个…)好的,非常感谢为我的问题命名。我把这本书放在我的书单上;)关于我的问题,我可以做你在图片中介绍的->然后我使用每个类型层次结构的表,但是它非常低效(查询),或者像你在事件类的子类中描述的那样。
 public class ObjectOne
{
    public int ObjectOneId { get; set; }
    public ICollection<Event> Events { get; set; }
}

public class ObjectTwo
{
    public int ObjectTwoId { get; set; }
    public ICollection<Event> Events { get; set; }
}


public class Event
{
    public int EventId { get; set; }
    public int ObjectId { get; set; }
    public string Type { get; set; }
}

public class AddEvent : Event
{
}

public class Updated : Event
{
}