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