属性X的类型为Y,而当前数据库提供程序不支持该类型。

26

我对EF(使用EF core 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”是类型为“Address”的,当前数据库提供程序不支持。要么更改属性CLR类型,要么使用“[NotMapped]”属性或在“OnModelCreating”中使用“EntityTypeBuilder.Ignore”忽略该属性。

我创建了以下类:

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 清楚地说,这是一个运行时错误,我查看了一些帖子,当他们尝试更新他们的数据库时会出现此错误herehere但他们的讨论没有指导我朝正确的方向(也许我错过了显而易见的东西)。
如何解决这个问题?最好不要更改结构,尽管如果有充分的理由可以这样做,我也很乐意。
3个回答

30

在约束条件中引用导航属性而不是映射属性,或类似的傻瓜式情况,也可能会出现此错误:

modelBuilder.Entity<TheEntity>().HasKey(ma => new { ma.SomeKey, ma.NavPropInsteadOfProp });

很不幸,错误信息并不够明确,但是暂时将引起错误的代码注释掉可以找到问题所在。


2
这就是我的问题所在。感谢您在这里提到它。它帮助我解决了我的问题。 - Josh
1
谢谢,正是我的情况。你可能至少为我节省了30分钟。 - refex
1
绝对棒的建议。你刚刚为我节省了很多时间和烦恼。 - Grigor Margaritov
1
我也引用了导航属性...但不是为了定义键...而是当我尝试映射到特定列名时。 - Jason

8
假设目标是使 BranchAddress 属性成为必填项。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Branch>()
        .HasOne(s => s.Address)
        .WithMany()
        .IsRequired();
}

你可以使用流畅的 API 来配置关系是必须的还是可选的。
来源: 必需和可选关系

7

最终看起来答案很简单,错误让我审视了我的类结构并试图找出问题所在。问题是,在我的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);
}

1
让我为那些一开始没有看到这个解决方案的人澄清一下。PO试图执行以下操作:Address.IsRequired(),而不是Address.PostalCode1.IsRequired()。检查引用问题类的类的配置,问题就出在那里。 - goku_da_master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接