Как я могу настроить сущность с двумя внешними ключами к себе? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть объект, у которого есть два внешних ключа для своей таблицы. Вот как это выглядит:

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; }
}

Обратите внимание на свойства AdminAssistant и Manager. Однако это дает мне следующую ошибку:

Невозможно определить основной конец ассоциации между типы 'SystemUser' и 'SystemUser'. Основной конец этого ассоциация должна быть явно настроена с использованием либо Свободное отношение 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 голосов
/ 02 мая 2018

Похоже, вы захотите включить что-то вроде

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...