问题
I am really new to EF (using EF core 2.1) and have been following a bunch of tutorials so far, but now I have ventred in to creating my own DB structure and stumbled when trying to add a value in to the 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
....
}
}
I get the error:
InvalidOperationException: The property 'Branch.Address' is of type 'Address' which is not supported by current database provider. Either change the property CLR type or ignore the property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.
I have created the following Classes:
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; }
}
I then ran:
Add-Migration init
Update-Database
The following was created:
To be clear this is a runtime error, I have viewed couple of threads that get this error when they try to update their db here and here but their discussions have not pointed me in the right direction (maybe I'm missing the obvious).
How do I resolve this? Preferably without Channing the structure, although I'm happy to if there is a good reason to do so
回答1:
It seems it was a fairly simple answer in the end, the error had me looking at the structure of my classes and trying to work out what had gone wrong. The problem was that in my BranchContext
(which I did not consider sharing in my question), I hooked into OnModelCreating
and set Address as required
Wrong
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);
}
Right
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);
}
回答2:
Assumption: the goal is to make Address
a required property of Branch
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Branch>()
.HasOne(s => s.Address)
.WithMany()
.IsRequired();
}
You can use the Fluent API to configure whether the relationship is required or optional
Source: Required and Optional Relationships
来源:https://stackoverflow.com/questions/55977692/the-property-x-is-of-type-y-which-is-not-supported-by-current-database-provider