首页 > 解决方案 > 多对多自我参考

问题描述

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

我目前的模型是:

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从自定义多对多关系引用的字段。这是好方法吗?

标签: c#asp.net-mvc-5entity-framework-6many-to-manydata-annotations

解决方案


我很确定你可以通过使用流利的 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>();
    }
}

推荐阅读