Базовое ядро ​​Entity Framework не может определить отношения - PullRequest
0 голосов
/ 18 декабря 2018

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

public class User : IdentityUser {}

public class Relationship {
   // User who created the relationship
   public User User {get;set;}

   // User who the creation user is friends with
   public User Friend {get;set;}

   // Enum of Status (Approved, Pending, Denied, Blocked)
   public RelationshipStatus RelationshipStatus {get;set;}

   public DateTime RelationshipCreationDate {get;set;}
}

У каждого пользователя может быть несколько записей, где они соответствуют Relationship.User, и у них может быть несколько записей, где они соответствуют Relationship.Friend.У меня есть моя настройка DbContext следующим образом в методе OnModelCreating:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Relationship>(relationship =>
    {
        relationship.HasOne(r => r.User).WithMany(u => u.Friends);                
    });            
}

Я новичок в Entity, так что это, вероятно, тривиально - Чего мне не хватает, чтобы настроить отношения, как я описал?Спасибо!

Редактировать: Чтобы быть более конкретным, вот ошибка, которую я получаю:

InvalidOperationException: Unable to determine the relationship represented by navigation property 'Relationship.Friend' of type 'User'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'

Редактировать 2: После переосмысления моего процесса, я взялдругой подход и использовал отношения, чтобы включать в себя подписчиков и подписчиков, а не коллективный список друзей (в любом случае лучше подходит для моей бизнес-модели).Я добился этого с помощью следующего:

public class User : IdentityUser {
  [InverseProperty("Friend")]
  public List<Relationship> Followers {get;set;}

  [InverseProperty("User")]
  public List<Relationship> Following {get;set;}
}

Мне любопытно, есть ли у кого-нибудь решение исходной проблемы за пределами моего решения, однако пока это работает и, кажется, подходит мне лучше всего.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Похоже, вы пытаетесь настроить many-to-many с той же сущностью.Для этого запишите классы моделей User и Relationship следующим образом:

public class User : IdentityUser 
{
   public List<Relationship> UserFriends { get; set; }
   public List<Relationship> FriendUsers { get; set; }
}

public class Relationship {

   public string UserId {get; set;} // `UserId` type is string as you are using default identity
   public User User {get;set;}

   public string FriendId {get; set;}
   public User Friend {get;set;}

   // Enum of Status (Approved, Pending, Denied, Blocked)
   public RelationshipStatus RelationshipStatus {get;set;}

   public DateTime RelationshipCreationDate {get;set;}
}

Затем в конфигурации сущности построителя модели:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Relationship>().HasKey(r => new {r.UserId, r.FriendId});

    modelBuilder.Entity<Relationship>()
    .HasOne(r => r.User)
    .WithMany(u => u.UserFriends)
    .HasForeignKey(r => r.UserId).OnDelete(DeleteBehavior.Restrict);

    modelBuilder.Entity<Relationship>()
    .HasOne(r => r.Friend)
    .WithMany(f => f.FriendUsers)
    .HasForeignKey(r => r.FriendId).OnDelete(DeleteBehavior.Restrict);
}

Теперь все должно работать правильно!

0 голосов
/ 19 декабря 2018

Вы пытались добавить в класс User список отношений, например

   public class User : IdentityUser {
       List<Relationship> Relationships {get;set;}
   }

Это может помочь EF полностью понять отношения.

...