我有一个实体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
时出现错误:
“性别”不能用作实体类型“用户”的属性,因为它 配置为导航。
答案 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();
}
}