.NET MVC实体框架:同一个两个表之间的一对多和多对多?

问题描述 投票:1回答:1

我有一个.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");
        });

这工作正常。但现在我需要在用户中添加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 :: Multiplicity在关系'ApplicationUser_company'中的Role'ApplicationUser_company_Target'中无效。由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为“*”。

在搜索解决方案后,我尝试装饰user.companies导航属性:

[InverseProperty("usuarios")]

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

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

.net asp.net-mvc entity-framework many-to-many one-to-many
1个回答
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; }
    }

此代码由Entity Framework使用数据库第一种方法生成。使用这个qazxsw poi。

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.