web-dev-qa-db-fra.com

La propriété X est de type Y qui n'est pas pris en charge par le fournisseur de base de données actuel

Je suis vraiment nouveau à EF (à l'aide de EF Core 2.1) et je suis à la suite d'un tas de tutoriels jusqu'à présent, mais maintenant, j'ai maintenant évanoui de créer ma propre structure de DB et que jeté en essayant d'ajouter une valeur à la DB:

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
        ....
    }
 }

Je reçois l'erreur:

InvalidOperationException: la propriété 'Branch.Address' est de type "adresse" qui n'est pas prise en charge par le fournisseur de base de données actuel. Soit modifier le type CLR de la propriété ou ignorer la propriété à l'aide de l'attribut "[NotMapped]" ou en utilisant "EnttityTypeBuilder.ignore" dans "OnModelCreatining".

J'ai créé les classes suivantes:

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; }
}

J'ai ensuite couru:

Add-Migration init
Update-Database

Ce qui suit a été créé:

DB structure

Pour être clair, il s'agit d'une erreur d'exécution, j'ai visionné un couple de threads qui obtiennent cette erreur lorsqu'ils essaient de mettre à jour leur dB ici et ici mais leurs discussions m'ont signalé Dans la bonne direction (peut-être que je manque de l'évidence).

Comment résoudre ça? De préférence sans chanter la structure, même si je suis heureux de si il y a une bonne raison de le faire

12
tony09uk

Il semble que ce fut une réponse assez simple à la fin, l'erreur m'avait envisagé de regarder la structure de mes classes et d'essayer de déterminer ce qui a mal tourné. Le problème était que dans mon BranchContext (que je n'ai pas envisagé de partager dans ma question), je me suis connecté à OnModelCreating et d'adresse définie comme requis

faux

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);
}

à droite

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);
}
3
tony09uk

Assomption: L'objectif est de faire Address une propriété requise de Branch

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Branch>()
        .HasOne(s => s.Address)
        .WithMany()
        .IsRequired();
}

Vous pouvez utiliser l'API fluide pour configurer si la relation est requise ou facultative.

Source: Relations requises et facultatives

3
spottedmahn