是否可以在一个表列中保留许多关系?

时间:2012-11-03 13:35:06

标签: entity-framework entity-relationship

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

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

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

 modelBuilder.Entity<ObjectOne>()
            .HasMany(c => c.Events).WithOptional().HasForeignKey(x => x.ObjectId);
        modelBuilder.Entity<ObjectTwo>()
            .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
{
}

提前致谢

1 个答案:

答案 0 :(得分:3)

此类多态关联通常被视为反模式,请参阅Bill Karwin的SQL Antipatterns。然而,可能存在这样的情况:它们不可避免(或者实际上不能保持清教徒)。如果您仍想使用它们,Bill Karwin非常友好地推荐实施。你应该阅读这本书的所有细节,但问题的核心是这个图:

(其中Comment具有您的Event表的作用,不要与图中的Event表混淆!!)。

在基表中,收集与Event关联的表的所有主键。

使用Entity Framework可以采用另一种方法(尽管对于您希望容纳的表的数量不太可行):您可以在EventOneEvent等中继承TwoEvent,其中Type是歧视者,将ObjectOneOneEventObjectTwoTwoEvent s关联等。