'propertyName'不能用作实体类型'typeName'的属性,因为它已配置为导航

时间:2019-11-01 12:42:02

标签: c# asp.net entity-framework asp.net-core entity-framework-core

我有一个实体user,其内容如下:

public class User
{
    [Key, Required]
    public int Id { get; set; }
    public int GenderId { get; set; }
    public virtual Gender Gender { get; set; }
}

gender中:

public class Gender
{
    [Key, Required]
    public int Id { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

然后,在我的DbContext内,我有:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>(user =>
    {
        user
        .HasOne(x => x.Gender)
        .WithMany(x => x.Users)
        .HasForeignKey(x => x.GenderId);
    }

    user.HasIndex(x => x.Gender);
}

运行dotnet ef add migration User时出现错误:

  

“性别”不能用作实体类型“用户”的属性,因为它   配置为导航。

4 个答案:

答案 0 :(得分:0)

在您的[ForeignKey("GenderId")]属性上使用public virtual Gender Gender { get; set; }。因此,GenderId将被标识为关联用户的外键。

请参见下面的更新代码:

public class User
{
    public int GenderId { get; set; }
    [ForeignKey("Id")]//Gender Primary key
    public virtual Gender Gender { get; set; }
}

希望它可以解决您的问题。

谢谢

答案 1 :(得分:0)

我有一个类似的错误:

  

'Product'不能用作实体类型'OrderLine'的属性   因为它被配置为导航。

错误的原因是,在流利的api中,我还将实体用作属性:

modelBuilder.Entity<OrderLine>().Property(ol => ol.Product).IsRequired(true)

答案 2 :(得分:0)

我试图在导航属性上创建索引。而是在外键上创建索引。

user.HasIndex(x => x.Gender)更改为user.HasIndex(x => x.GenderId)

答案 3 :(得分:0)

对于包含嵌套复杂类的复杂层次模型,我也遇到了同样的问题。
显然,IsRequired()方法与OnDelete(...)冲突。我删除了IsRequired(),一切恢复正常。

public class MyComplexClassConfig : IEntityTypeConfiguration<MyComplexClass>
{
    public void Configure(EntityTypeBuilder<MyComplexClass> builder)
    {
        builder
            .HasOne(col => col.ChildClass)
            .WithOne(col => col.ParentClass)
            .OnDelete(DeleteBehavior.Cascade);
            
        // The following line of code needs to be deleted.
        builder.Property(col => col.Customer).IsRequired();
    }
}