为了账号安全,请及时绑定邮箱和手机立即绑定

多对多自参考

多对多自参考

C#
慕的地10843 2021-11-28 16:02:05
一个用户可以管理多个公司。并且用户可以从多公司列表中一次拥有一个活跃的公司。我怎么能做到这一点?我目前的模型是: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从自定义多对多关系引用的另一个字段。这是好方法吗?
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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

    }

}


查看完整回答
反对 回复 2021-11-28
?
撒科打诨

TA贡献1934条经验 获得超2个赞

你能试试这个映射吗:


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

}


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信