在ef核心中使用流畅的api映射身份基类的正确方法?

时间:2018-03-04 04:08:46

标签: c# entity-framework-core ef-fluent-api ef-core-2.0

如果我想将实体作为主键,我怎么认为我必须在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,但如果我这样做,我将不会创建身份的主键,对吗?

1 个答案:

答案 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对象