一个用户可以管理许多公司。用户可以一次从多个公司列表中拥有一个活跃的公司。我该如何实现?
我当前的模型是:
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>();
}
}
如果我添加另一个注释:
public class User
{
public int CompanyId
public virtual Company Company { get; set; }
}
此模型不会引用UserCompany
表中的多对多表。
我该如何实现?还是针对这种情况有另一种方法?
现在,我正在考虑制作手动的多对多关系模型,并添加从自定义多对多关系引用的另一个ActiveCompany
字段。这是好方法吗?
答案 0 :(得分:0)
我很确定您可以通过使用流畅的api并在OnModelCreating
中覆盖DbContext
方法来做到这一点,但是我没有示例。
但是,您可能会发现为用户添加另一个属性会更容易
public int ActiveCompanyId { get; set; }
有很多变量,例如您是否使用延迟加载,有多少家公司/用户,您的数据访问方式是什么,这些可能决定您最好的整体方法。如果您的Companies
属性通常或始终被填充,那么您可以创建一个仅get
的未映射属性:
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>();
}
}
答案 1 :(得分:0)
您可以尝试以下映射吗?
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);
}