Свойство X имеет тип Y, который не поддерживается текущим поставщиком базы данных - PullRequest
6 голосов
/ 04 мая 2019

Я действительно новичок в EF (использую ядро ​​EF 2.1) и до сих пор читал кучу учебников, но теперь я рискнул создать собственную структуру БД и оступился, пытаясь добавить значение в БД.:

    private async Task<int> Insert()
    {
        var address = new Address { AddressLine1 = "1 any street",  AddressLine2 = "", AddressLine3 = "", City = "Any city" };

        using (var context = new BranchContext())
        {
            context.Addresses.AddAsync(address);//ERROR HERE
            ....
        }
     }

Я получаю сообщение об ошибке:

InvalidOperationException: свойство Branch.Address имеет тип «Адрес», который не поддерживается текущим поставщиком базы данных.Либо измените тип свойства CLR, либо игнорируйте свойство с помощью атрибута [NotMapped] или с помощью EntityTypeBuilder.Ignore в OnModelCreating.

Я создал следующие классы:

public class Address
{
    public int Id { get; set; }
    public int Guid { get; set; }
    public DateTime CreatedOn { get; set; }
    public string Number { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressLine3 { get; set; }
    public string Town { get; set; }
    public string City { get; set; }
    public string Postcode1 { get; set; }
    public string Postcode2 { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

public class Branch
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public IEnumerable<EmployeeBranch> Employee { get; set; }
    public bool IsMain { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Guid { get; set; }
    public string EmailAddress { get; set; }
    public JobTitle JobTitle { get; set; }
    public DateTime DateOfBirth { get; set; }
    public IEnumerable<EmployeeBranch> Branches { get; set; }
    public Branch PrimaryBranch { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PreferredName { get; set; }
    public Salutations Salutation { get; set; }
}

public enum Salutations
{
    Mr = 1,
    Mrs = 2,
    Miss = 3,
    Ms = 4
}

public class EmployeeBranch
{
    public int BranchId { get; set; }
    public Branch Branch { get; set; }
    public int EmployeeId { get; set; }
    public Employee Employee { get; set; }
}

public class JobTitle
{
    public int Id { get; set; }
    public string Guid { get; set; }
    public string Name { get; set; }
}

Затем я запустил:

Add-Migration init
Update-Database

Было создано следующее:

DB structure

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

Как мне решить эту проблему?Желательно без изменения структуры, хотя я рад, если есть веская причина для этого

1 Ответ

0 голосов
/ 18 мая 2019

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

Неправильно

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EmployeeBranch>()
        .HasKey(s => new { s.BranchId, s.EmployeeId });
    modelBuilder.Entity<Branch>()
        .Property(s => s.Address).IsRequired();
    modelBuilder.Entity<Branch>()
        .Property(s => s.Name).IsRequired();

    base.OnModelCreating(modelBuilder);
}

Справа

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EmployeeBranch>()
        .HasKey(s => new { s.BranchId, s.EmployeeId });

    modelBuilder.Entity<Address>()
        .Property(s => s.AddressLine1).IsRequired();
    modelBuilder.Entity<Address>()
        .Property(s => s.Postcode1).IsRequired();
    modelBuilder.Entity<Address>()
        .Property(s => s.Postcode2).IsRequired();
    ...the other required elements...
    modelBuilder.Entity<Branch>()
        .Property(s => s.Name).IsRequired();

    base.OnModelCreating(modelBuilder);
}
...