实体框架中多对多关系中的多个实体

时间:2013-04-12 22:22:08

标签: c# asp.net-mvc entity-framework

假设我有3个班级:

public class Tag {
    public string Name { get; set; }
}

public class Post {
     public virtual IList<Tag> Tags { get; set; }
}

public class User {
     public virtual IList<Tag> Tags { get; set; }
}

现在,用户和标签以及帖子和标签之间存在多对多的关系。

简化:我有一个标签列表,我希望能够标记用户和帖子,而标签保持独立。

现在,我可以创建一个地图并将多个地图映射到多个,创建两个表:Users_Tags和Posts_Tags,但我需要它们在同一个表中。

我需要一个: Entities_Tags:Entity_Id,Tag_Id,Descriminator

通常我会创建一个基类,Tag和Post都继承自......“TagContainer”。创建:TagContainers_Tags:TagContainer_Id,Tag_Id

现在的问题是,在我的情况下,在我想到的实体中,它们共享相同的基类是没有意义的。这是因为我有另一个基类做同样的事情会发生冲突。并且让该类继承其中一个基类在应用程序方面没有意义。

如果EF支持接口,我当然会通过让我的类继承必要的接口以支持第一个和第二个多对多实体来解决这个问题。

我正在寻找一种方法让EF支持基于多对多表的Discriminator,而不必向我的实体提供基类。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

因此,您不能在两个不同的多对多关系中使用该表。如果你真的不想在模型和数据库表中进行任何类型的泛化(虽然它在规范化大数据库设计中最常见),你可以这样做:

public class MyTrust
    {
        public MyTrust()
        {
            MyLocations = new List<MyLocation>();
        }
        public int MyTrustID { get; set; }
        public string MyTrustName { get; set; }
        public virtual ICollection<MyLocation> MyLocations { get; set; }
    }
    public class MyLocation
    {

        public int MyLocationID { get; set; }
        public string MyLocationName { get; set; }
        public virtual MyTrust MyTrust { get; set; }
}

public class TaskDbContext : DbContext
    {
        public DbSet<MyTrust> MyTrusts { get; set; }
        public DbSet<MyLocation> MyLocations { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<MyTrust>().HasMany(t => t.MyLocations).WithRequired();
        }
    }

查看示例来源here