1

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

是否可以将 Id 的值保留在一列中Event.ObjectId并保留属性中的关系类型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
{
}

提前致谢

4

1 回答 1

3

这种多态关联通常被认为是一种反模式,请参阅 Bill Karwin 的SQL Antipatterns 。但是,在某些情况下,它们可能会变得不可避免(或者过于实际而无法保持清教徒状态)。如果您仍然想使用它们,Bill Karwin 很乐意推荐一个实现。您应该阅读本书以了解所有细节,但问题的核心是这张图:

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

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

With Entity Framework another approach is possible (although not really feasible with the number of tables you wish to accommodate): you can subclass Event in OneEvent, TwoEvent etc., where Type is the discriminator, and associate ObjectOne with OneEvents, ObjectTwo with TwoEvents, etc.

于 2012-11-03T18:22:52.310 回答