Как связать два свойства с одним классом, но только с возможностью ссылаться на одно в EFC Code First? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть два класса:

public class User
{
    public Guid UserId { get; set; }
    [Required]
    public string Username { get; set; }
    [Required]
    public string Password { get; set; }

    public UserProfile UserProfile { get; set; }
}

public class UserProfile
{
    public int UserProfileId { get; set; }
    public string Avatar { get; set; }

    public User User { get; set; }
    public User Wingman { get; set; }
}

При попытке понятного добавления миграции я получаю следующую ошибку:

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

UserProfile.User - это сам пользователь, а UserProfile.Wingman другой пользователь, представляющий ведомого.Нужна ли мне другая таблица для этого, как мост, или есть другой способ решить эту проблему?И мне не нужно ссылаться на Wingman из User.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете использовать InversePropertyAttribute или методы конфигурации Fluent API HasOne / WithOne или HasOne/WithMany с соответствующими селекторами свойств.

Если вы ищете 1: 1 отношение, используйте первичный ключ осколка - сделайте PK для UserProfile FK для пользователя.

modelBuilder.Entity<UserProfile>()
    .HasOne( up => up.User )
    .WithOne( u => u.UserProfile )
    .HasForeignKey( up => up.UserProfileId ); // I suggest renaming PK to UserId for clarity

Если отношение 1: N, два способа;сначала w / InversePropertyAttribute:

public class User
{
    ...
    [InverseProperty( "User" )]
    public ICollection<UserProfile> UserProfiles { get; set; }
}

Или через Fluent API:

modelBuilder.Entity<UserProfile>()
    .HasOne( up => up.User )
    .WithMany( u => u.UserProfiles );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...