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éé:
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
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);
}
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.