3

假设我有 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,但我需要它们在同一个表中。

我需要一个:Entity_Tags:Entity_Id,Tag_Id,Decriminator

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

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

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

我几乎在寻找一种方法来让 EF 支持基于鉴别器的多对多表,而无需向我的实体提供基类。

有什么建议么?

4

1 回答 1

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();
        }
    }

在此处查看示例的来源

于 2014-01-25T20:12:13.900 回答