我有一个.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 ::多重性在角色中无效 关系中的“ ApplicationUser_company_Target” “ ApplicationUser_company”。因为从属角色属性是 不是关键属性,而是多重性的上限 从属角色必须为“ *”。
在寻找解决方案之后,我尝试使用以下方式装饰user.companies导航属性:
[InverseProperty("usuarios")]
但这不能解决错误...
(附加信息:两个模型都位于不同的名称空间中,用户位于myApp.Models中,公司位于myApp.Models.DAL中,但我想这不会影响问题...)
答案 0 :(得分: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使用数据库的第一方法生成。 使用此database model。
我希望这会有所帮助。