【问题标题】:.NET MVC Entity Framework: one-to-many and many-to-many between the same two tables?.NET MVC Entity Framework:相同的两个表之间的一对多和多对多?
【发布时间】:2019-02-27 14:53:23
【问题描述】:

我有一个 .NET MVC 应用程序,我在其中创建了用户和公司之间的多对多关系(这些是用户可以访问的公司)。

在用户模型中,我添加了一组公司:

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

在公司模型中,我添加了一组用户:

public virtual ICollection<ApplicationUser> users { get; set; }

并在 OnModelCreating() 中添加:

    modelBuilder.Entity<ApplicationUser>()
        .HasMany<Company>(s => s.companies)
        .WithMany(c => c.users)
        .Map(cs =>
        {
            cs.MapLeftKey("id_user");
            cs.MapRightKey("id_company");
            cs.ToTable("users_companies");
        });

这工作正常。但是现在我需要在 users 中添加一个 FK,为用户添加一个可选的公司(代表用户的公司)。这种关系与用户-公司关系无关。

所以我在用户模型中添加了一个属性:

[ForeignKey("company")]
[Display(Name = "Company")]
public int? Id_company { get; set; }

还有一个导航属性:

public virtual Company company { get; set; }

在公司模型中,我还添加了一个导航属性:

public virtual ApplicationUser user { get; set; }

但是当我尝试更新数据库时,我得到了这个错误:

ApplicationUser_company_Target: : 多重性在角色中无效 关系中的“ApplicationUser_company_Target” 'ApplicationUser_company'。因为从属角色属性是 不是关键属性,多重性的上限 从属角色必须是“*”。

在寻找解决方案后,我尝试使用以下方法装饰 user.companies 导航属性:

[InverseProperty("usuarios")]

但这并没有解决错误...

(附加信息:两个模型位于不同的命名空间中,用户在 myApp.Models 中,公司在 myApp.Models.DAL 中,但我想这不会影响问题...)

【问题讨论】:

  • 你为什么把这个添加到公司:public virtual ApplicationUser user { get;放; }

标签: .net asp.net-mvc entity-framework many-to-many one-to-many


【解决方案1】:

据我所知,消息告诉您的是,您的设计代表了一对一的关系,而且必须是一对多的。

为此,您必须更改公司模式:

public virtual ApplicationUser user { get; set; }

收件人:

public virtual ICollection<ApplicationUser> user { get; set; }

此外,您最终会在公司模型中获得两个用户集合。

这样

public partial class Company
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Company()
        {
            this.User = new HashSet<User>();
            this.User1 = new HashSet<User>();
        }

        public int Id { get; set; }
        public string Name { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<User> User { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<User> User1 { get; set; }
    }

此代码是由实体框架使用数据库优先方法生成的。 使用这个database model

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多