C# 多对多自参考

C# 多对多自参考,c#,asp.net-mvc-5,entity-framework-6,many-to-many,data-annotations,C#,Asp.net Mvc 5,Entity Framework 6,Many To Many,Data Annotations,一个用户可以管理多个公司。用户可以从多个公司的列表中一次拥有一个活跃的公司。我怎样才能做到这一点 我目前的模式是: public class User { public int Id public virtual ICollection<Company> Companies { get; set; } public User() { this.Companies = new HashSet<Company>();

一个用户可以管理多个公司。用户可以从多个公司的列表中一次拥有一个活跃的公司。我怎样才能做到这一点

我目前的模式是:

public class User
{
    public int Id

    public virtual ICollection<Company> Companies { get; set; }

    public User()
    {
        this.Companies = new HashSet<Company>();
    }
}
public class Company
{
    public int Id

    public virtual ICollection<User> Users { get; set; }

    public User()
    {
        this.Users = new HashSet<User>();
    }
}
该模型不会引用多对多表
UserCompany

我怎样才能做到这一点?还是有其他方法来解决这个问题


现在我正在考虑创建手动多对多关系模型,并添加另一个从自定义多对多关系引用的
ActiveCompany
字段。这是一种好方法吗?

我非常肯定,您可以通过使用fluent api并在
DbContext
中重写
OnModelCreating
方法来实现这一点,但我手头没有示例

但是,您可能会发现为用户添加另一个属性更容易

public int ActiveCompanyId { get; set; }
有很多变量,如是否使用延迟加载、有多少公司/用户、您的数据访问模式是什么,这些都可能决定您的最佳总体方法。如果您的
公司
属性通常或始终填充,则可以创建未映射的
仅获取
属性:

public class User
{
    public int Id

    public virtual ICollection<Company> Companies { get; set; }

    public int ActiveCompanyId { get; set; }

    [NotMapped]
    public Company ActiveCompany
    {
        get
        {
          return this.Companys == null ? null :
                      Companies.Where(x => x.Id == this.Active.CompanyId)
                               .SingleOrDefault;
        }
    }

    public User()
    {
       this.Companies = new HashSet<Company>();
    }
}
公共类用户
{
公共整数Id
公共虚拟ICollection公司{get;set;}
public int ActiveCompanyId{get;set;}
[未映射]
上市公司
{
得到
{
返回此值。公司==null?null:
companys.Where(x=>x.Id==this.Active.CompanyId)
.SingleOrDefault;
}
}
公共用户()
{
this.companys=new HashSet();
}
}

您可以尝试以下映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>()
        .HasMany(c => c.Users)
        .WithMany(u => u.Comapnies)
        .Map(x =>
        {
            x.MapLeftKey("CompanyId");
            x.MapRightKey("UserId");
            x.ToTable("UserCompany");
        });

    modelBuilder.Entity<User>()
        .HasRequired(b => b.Company)
        .WithMany()
        .WillCascadeOnDelete(false);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(c=>c.Users)
.有许多(u=>u.com)
.Map(x=>
{
x、 MapLeftKey(“公司ID”);
x、 MapRightKey(“用户ID”);
x、 ToTable(“用户公司”);
});
modelBuilder.Entity()
.HasRequired(b=>b.Company)
.有很多
.WillCascadeOnDelete(假);
}

HI here,我想在多对多关系中将这个ActiveCompanyId作为
CompanyId
的外键,以防
ActiveCompanyId
不在多对多表中。我认为这个模型将允许公司中的任何
ActiveCompanyId
,即使不是在多对多表中。可能吗?谢谢你。试试看——我一点也不知道
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>()
        .HasMany(c => c.Users)
        .WithMany(u => u.Comapnies)
        .Map(x =>
        {
            x.MapLeftKey("CompanyId");
            x.MapRightKey("UserId");
            x.ToTable("UserCompany");
        });

    modelBuilder.Entity<User>()
        .HasRequired(b => b.Company)
        .WithMany()
        .WillCascadeOnDelete(false);
}