我首先使用实体框架代码,但我遇到了问题,因为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
{
}
提前致谢
答案 0 :(得分:3)
此类多态关联通常被视为反模式,请参阅Bill Karwin的SQL Antipatterns。然而,可能存在这样的情况:它们不可避免(或者实际上不能保持清教徒)。如果您仍想使用它们,Bill Karwin非常友好地推荐实施。你应该阅读这本书的所有细节,但问题的核心是这个图:
(其中Comment具有您的Event表的作用,不要与图中的Event表混淆!!)。
在基表中,收集与Event
关联的表的所有主键。
使用Entity Framework可以采用另一种方法(尽管对于您希望容纳的表的数量不太可行):您可以在Event
,OneEvent
等中继承TwoEvent
,其中Type
是歧视者,将ObjectOne
与OneEvent
,ObjectTwo
与TwoEvent
s关联等。