如何设置一个带有两个外键的实体?

时间:2018-05-02 16:47:15

标签: c# entity-framework

我有一个实体,它有两个外键给它自己的表。这就是它的样子:

public class SystemUser : BaseModel
{
    [Column("SystemUserId")]
    public override Guid ID { get; set; }

    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string MobilePhone { get; set; }
    public Guid? MobilePhoneProviderId { get; set; }
    public virtual MobilePhoneProvider MobilePhoneProvider { get; set; }
    public Guid? ManagerId { get; set; }
    public virtual SystemUser Manager { get; set; }
    public Guid? AdminAssistantId { get; set; }
    public virtual SystemUser AdminAssistant { get; set; }

    public bool IsActive { get; set; }
    public bool SendEmail { get; set; }

    public string FinaleUsername { get; set; }
    public string FinalePassword { get; set; }
    public int? FloatUserId { get; set; }

    public Guid? SystemUserTypeId { get; set; }
    public virtual SystemUserType SystemUserType { get; set; }
    public Guid? SystemUserJobFunctionId { get; set; }
    public virtual SystemUserJobFunction SystemUserJobFunction { get; set; }
    public Guid? SystemUserJobRoleId { get; set; }
    public virtual SystemUserJobRole SystemUserJobRole { get; set; }
    public Guid? SystemUserLocationId { get; set; }
    public virtual SystemUserLocation SystemUserLocation { get; set; }

    public virtual ICollection<SystemUserRole> Roles { get; set; }
}

请注意AdminAssistantManager属性。但它给了我以下错误:

  

无法确定之间关联的主要结束   类型&#39; SystemUser&#39;和&#39; SystemUser&#39;。这个的主要目的   必须使用以下任一方式显式配置关联   关系流畅的API或数据注释。

如果我删除其中一个(任何一个,它并不重要),它可以正常工作但由于某种原因,它会让两个人感到困惑。我尝试在每个属性上添加ForeignKey属性,并使用流畅的API对其进行如下配置:

modelBuilder.Entity<SystemUser>()
            .HasOptional(x => x.Manager)
            .WithMany()
            .HasForeignKey(x => x.ManagerId);

modelBuilder.Entity<SystemUser>()
            .HasOptional(x => x.AdminAssistant)
            .WithMany()
            .HasForeignKey(x => x.AdminAssistantId);

都没有奏效。我有什么方法可以做到这一点吗?

仅供参考我没有使用Code First。我手动编写数据库脚本,只使用EF作为ORM。不确定这些信息是否相关,但我还是认为我还是会给它。

1 个答案:

答案 0 :(得分:3)

看起来你想要包含类似

的内容
ICollection<SystemUser> ManagedUsers {get; set;}
ICollection<SystemUser> AdminAssistedUsers {get; set;}

然后你应该可以做这样的事情:

modelBuilder.Entity<SystemUser>()
        .HasOptional(x => x.Manager)
        .WithMany(x => x.ManagedUsers)
        .HasForeignKey(x => x.ManagerId)
        .WillCascadeOnDelete(false);

modelBuilder.Entity<SystemUser>()
        .HasOptional(x => x.AdminAssistant)
        .WithMany(x => x.AdminAssistedUsers)
        .HasForeignKey(x => x.AdminAssistantId)
        .WillCascadeOnDelete(false);