Проблема при адд-миграции в этом текущем классе мостов (многие-ко-многим) - PullRequest
0 голосов
/ 17 ноября 2018

В настоящее время у нас есть эта модель - HostApplicationUser, и она является мостовой для отношений «многие ко многим» между Host и ApplicationUser (расширен от IdentityUser).

public class HostApplicationUser
{
    public Guid HostID { get; set; }

    public Host Host { get; set; }

    public string Id { get; set; }

    public ApplicationUser ApplicationUser { get; set; }

    public bool IsDeleted { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }

}

В нашем ApplicationDBContext мы изменили защищенное переопределение void OnModelCreating (построитель ModelBuilder), добавив следующее:

// Many to Many relationships

            builder.Entity<HostApplicationUser>()
                .HasKey(bc => new { bc.HostID, bc.Id });


            builder.Entity<HostApplicationUser>()
                .HasOne(bc => bc.Host)
                .WithMany(b => b.HostApplicationUsers)
                .HasForeignKey(bc => bc.HostID);

            builder.Entity<HostApplicationUser>()
                .HasOne(bc => bc.ApplicationUser)
                .WithMany(c => c.HostApplicationUsers)
                .HasForeignKey(bc => bc.Id);

Этот код работает нормально. НО теперь у нас есть новое требование добавить несколько свойств / навигации следующим образом:

public class HostApplicationUser
{
    public Guid HostID { get; set; }

    public Host Host { get; set; }

    public string Id { get; set; }

    public ApplicationUser ApplicationUser { get; set; }

    public DateTime CreatedUTC { get; set; }

    public string CreatedBy { get; set; }

    public DateTime LastModifiedUTC { get; set; }

    public string LastModifiedBy { get; set; }

    public DateTime? DeletedUTC { get; set; }

    public string DeletedBy { get; set; }

    public bool IsDeleted { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }

    [ForeignKey("CreatedBy")]
    public ApplicationUser ApplicationCreatedUser { get; set; }

    [ForeignKey("LastModifiedBy")]
    public ApplicationUser ApplicationLastModifiedUser { get; set; }

}

Тогда у нас возникает ошибка при запуске надстройки:

Невозможно определить отношение, представленное свойством навигации 'HostApplicationUser.ApplicationCreatedUser' типа 'ApplicationUser'. Либо настройте отношение вручную, либо игнорируйте это свойство с помощью атрибута [NotMapped] или с помощью EntityTypeBuilder.Ignore в OnModelCreating.

Есть идеи, как это исправить? Я считаю, что это как-то связано с OnModelCreating (компоновщик ModelBuilder), чтобы включить другую навигацию, но я не уверен, как это сделать.

Спасибо

1 Ответ

0 голосов
/ 19 ноября 2018

Причина

Причина в том, что имеется несколько свойств навигации на парах зависимых и главных объектов .Учитывая следующие отношения между HostApplicationUser и ApplicationUser:

  1. ApplicationUser <-> HostApplicationUser.ApplicationUser
  2. ApplicationUser <-> HostApplicationUser.ApplicationCreatedUser
  3. ApplicationUser <-> HostApplicationUser.ApplicationLastModifiedUser
  4. ... и потенциальные отношения для DeletedBy

Если у вас есть свойство навигации для HostApplicationUser на ApplicationUser:

public class ApplicationUser{
    public string Id{get;set;}
    public string Name {get;set;}

    public IList<HostApplicationUser> HostApplicationUsers{get;set;} 
}

И если нет дополнительной конфигурации, EF Core не может определить, является ли свойство Application.HostApplicationUsers CreatedUsers, LastModifiedUsers, DeletedUsers или чем-то другим, например, EF Core не может определить, как свойство ApplicationUser.HostApplicationUsers перемещается к HostApplicationUser, поэтому жалуется:

Невозможно определить отношение, представленное свойством навигации 'HostApplicationUser.ApplicationCreatedUser'типа «ApplicationUser».Либо настройте отношение вручную, либо проигнорируйте это свойство с помощью атрибута [NotMapped] или с помощью EntityTypeBuilder.Ignore в OnModelCreating.

Как исправить

Кисправить проблему, просто украсить ApplicationUser.HostApplicationUsers InversePropertyAttribute:

public class ApplicationUser{
    public string Id{get;set;}
    public string Name {get;set;}

    [InverseProperty("ApplicationUser")]
    public IList<HostApplicationUser> HostApplicationUsers{get;set;} 
}

Или, если вы хотите иметь несколько свойств навигации, вам нужно добавить [InverseProperty("ApplicationCreatedUser")], [InverseProperty("ApplicationLastModifiedUser")], [InverseProperty("ApplicationDeletedUser")] и т. Д. Для каждого свойства навигации:

public class ApplicationUser{
    public string Id{get;set;}
    public string Name {get;set;}

    [InverseProperty("ApplicationUser")]
    public IList<HostApplicationUser> HostApplicationUsers{get;set;} 

    [InverseProperty("ApplicationCreatedUser")]
    public IList<HostApplicationUser> HostApplicationCreatedUsers{get;set;}

    [InverseProperty("ApplicationLastModifiedUser")]
    public IList<HostApplicationUser> HostApplicationLastModifiedUsers{get;set;}

    // ...
}
...