我有2个用户和组织的模型类。
public class User : IdentityUser
{
[Required]
public string Name { get; set; }
[Required]
public string Surname { get; set; }
public int? OrganizationID { get; set; }
public virtual OrgList org { get; set; }
}
public class OrgList
{
public OrgList()
{
employees = new HashSet<User>();
}
public int id { get; set; }
public String name { get; set; }
public String ownerId { get; set; }
public virtual ICollection<User> employees { get; set; }
public virtual User ownerUser { get; set; }
}
用户可以是某个组织的所有者,也是同一组织的员工(但其他员工不能成为该组织的所有者)。
首先,我已经为员工建立了一种关系并且运作正常
modelBuilder.Entity<OrgList>(entity =>
{
entity.HasMany(e => e.employees)
.WithOne(e => e.org)
.HasForeignKey(e => e.OrganizationID)
.OnDelete(DeleteBehavior.SetNull);
}
但是当我尝试为所有者添加另一种关系时
entity.HasOne(e => e.ownerUser)
.WithOne(e => e.org)
.HasForeignKey<OrgList>(e => e.ownerId)
.OnDelete(DeleteBehavior.Cascade);
我在迁移时遇到错误:
无法在&#39; User.org&#39;之间建立关系。和 &#39; OrgList.ownerUser&#39;,因为之间已经存在关系 &#39; OrgList.employees&#39;和&#39; User.org&#39;。导航属性只能 参加一个单一的关系。
我该如何解决?我找到了EF6(不是EF Core)的答案,其中包含EF Core中不存在的HasOptional()
和WithOptionalPrincipal()
方法。
我是否可以在不为员工创建额外表格或在用户类上创建其他virtual OrgList
的情况下执行此操作?
答案 0 :(得分:0)
您尝试使用您用于员工关系的用户的相同属性创建所有者关系。实体框架不知道分配属性的关系。如果您在用户上创建了另一个属性,如
entity.HasOne(e => e.ownerUser)
.WithOne(e => e.OwnedOrg)
.HasForeignKey<OrgList>(e => e.ownerId)
.OnDelete(DeleteBehavior.Cascade);
并将语句更改为
newObs = combineLatest(
this.itemObs,
this.boolObs1
this.boolObs3,
(item, bool1, bool2) => ((item || bool1) && bool2) ? item : null
);
我想它应该有用。