如果我想将实体作为主键,我怎么认为我必须在EF Core中映射身份基类
我基于Vaughn Vernon(example)的项目示例,在这个例子中,他创建了一个这样的身份类:
public class ProductId : Identity
{
public ProductId()
: base()
{
}
public ProductId(string id)
: base(id)
{
}
}
这是他的实施
public class Product {
public ProductId ProductId {get; private set;}
}
我怀疑这是映射这个的正确方法是什么?因为我试图直接映射modelBuilder.Entity<Product>().HasKey(p => p.ProductId);
,但在迁移EF Core告诉我
无法在实体类型“Product”上为属性“ProductId”调用Property,因为它已配置为导航属性。 属性只能用于配置标量属性。
我知道我可以使用OwnsOne,但如果我这样做,我将不会创建身份的主键,对吗?
答案 0 :(得分:0)
您的对象应如下所示
对象类
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
...
}
默认情况下,实体框架将查找名为Id或ProductId的对象,并自动将其作为主键。因此,虽然不需要在DbContext中设置密钥,但您可以执行此操作。我通常不会设置Id,除非它是一个不同的名称。
的DbContext
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Product>().HasKey(x => x.Id);
}
**更新**
如果您没有在db上下文中设置DbSets,那么您确实必须在OnModelCreating调用中设置id,以便迁移将对象识别为Entity对象