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

C# 实体框架中多对多关系中的多个实体,c#,asp.net-mvc,entity-framework,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; } } 公共类标记{ 公共字符串名称{get;set;}

假设我有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; }
}
公共类标记{
公共字符串名称{get;set;}
}
公营职位{
公共虚拟IList标记{get;set;}
}
公共类用户{
公共虚拟IList标记{get;set;}
}
现在,用户和标签之间以及帖子和标签之间都存在多对多关系

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

现在,我可以创建一个映射并映射一个双多对多,创建两个表:Users\u标记和Posts\u标记,但我需要它们位于同一个表中

我需要一个: 实体\标记:实体\ Id、标记\ Id、描述符

通常我会创建一个基类,Tag和Post都继承自。。。“标记容器”。创建:TagContainers\u标记:TagContainer\u Id,Tag\u Id

现在的问题是,在我的情况下,在我心目中的实体中,它们共享相同的基类是没有意义的。这是因为我有另一个基类做同样的事情,这会产生冲突。让那个类继承这些基类中的一个并没有意义

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

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


有什么建议吗?

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

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();
        }
    }
公共类MyTrust
{
公共信托基金()
{
MyLocations=新列表();
}
public int MyTrustID{get;set;}
公共字符串MyTrustName{get;set;}
公共虚拟ICollection MyLocations{get;set;}
}
公共类位置
{
public int MyLocationID{get;set;}
公共字符串MyLocationName{get;set;}
公共虚拟MyTrust MyTrust{get;set;}
}
公共类TaskDbContext:DbContext
{
公共数据库集MyTrusts{get;set;}
公共数据库集MyLocations{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()有许多(t=>t.MyLocations).WithRequired();
}
}

查看示例的来源

我有另一个基类做同样的事情,这会产生冲突。这并不完全清楚,但它似乎是问题的核心。所以我认为你应该在你的示例模型中演示它。你的问题让我大吃一惊。我相信使用数据库优先的方法会解决你的问题吗?