Entity Framework Ядро Тип Значения, Имеющего ОбъектПочему? - PullRequest
1 голос
/ 20 сентября 2019

Я использую EF Core 2.2.У меня есть два контекста в моем приложении.Один - AppIdentityDbContext для работ, связанных с идентификацией, а другой - AppContext для работ, связанных с приложениями.

У меня есть класс идентификации пользователя - ApplicationUser -, который имеет отношение к Profile сущности из AppContextи объект Profile в свою очередь владеет объектом значения ProfileContact.

Вот код:

ApplicationUser

public class ApplicationUser : IdentityUser<Guid>
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Designation { get; set; }

    public Guid ProfileId { get; set; }
    public Profile Profile { get; set; }
}

Профиль

public class Profile : BaseEntity<Guid>, IAggregateRoot
{
    private Profile()
    {
        // required by EF
    }

    public Profile(string brandName, ProfileContact profileContact)
    {
        BrandName = brandName;
        ProfileContact = profileContact;
    }

    public string BrandName { get; set; }

    public ProfileContact ProfileContact { get; private set; }
}

ProfileContact

public class ProfileContact // ValueObject
{
    private ProfileContact()
    {
        // required by EF
    }

    public ProfileContact(string email, string phone, string mobile)
    {
        Email = email;
        Phone = phone;
        Mobile = mobile;
    }

    public string Email { get; private set; }
    public string Phone { get; private set; }
    public string Mobile { get; private set; }
}

IAggregateRoot

IAggregateRoot - пустой интерфейс, используемый для ограничения сущностей от использования общих репозиториев в моем проекте.

public interface IAggregateRoot
{
}

AppContext

Вот конфигурация объекта «Профиль» в AppContext.

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Profile>(ConfigureProfile);
}

private void ConfigureProfile(EntityTypeBuilder<Profile> builder)
{
    builder.Property(p => p.BrandName)
        .IsRequired()
        .HasMaxLength(50);

    builder.OwnsOne(p => p.ProfileContact);
}

Я настроил ProfileContact как принадлежащийProfile сущность.

Теперь, когда пользователь входит в систему, я получаю эту ошибку:

image Описание ошибки ">

image стек ошибок ">

Вот мой логин Post метод.Я использую шаблон скаффолдинга Asp.Net Core Identity.

Вход в систему - OnPostAsync

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
   returnUrl = returnUrl ?? Url.Content("~/");

   if (ModelState.IsValid)
   {
       // This doesn't count login failures towards account lockout
       // To enable password failures to trigger account lockout, set lockoutOnFailure: true
       var result = await _signInManager.PasswordSignInAsync(Input.MobileNumber, Input.Password, Input.RememberMe, lockoutOnFailure: true);
       if (result.Succeeded)
       {
         ....

    // If we got this far, something failed, redisplay form
    return Page();
}

Требуется ли ключ объекта значения / собственного типа для определения?Что я прочитал и понял о OwnedTypes, так это то, что они принадлежат одной и той же таблице, но могут использоваться как объект.Я делаю что-то не так?или мне нужно добавить свойство Id к ProfileContact.Если так, то почему?Пожалуйста, помогите.

1 Ответ

0 голосов
/ 29 сентября 2019

Я думаю, что эта проблема возникает, если у вас есть два отдельных контекста.Один для приложения и другой для Asp.Net Identity с настроенными моделями ASP.NET Identity.И это также с отношениями между сущностями в обоих контекстах.

В этом случае добавление base.OnModelCreating(builder) в оба context * OnModelCreating(ModelBuilder builder) решает проблему.

Спасибо Герт Арнольд за руководство и обучение.Кредиты вам.

...