【问题标题】:the correct way to map identity base class with fluent api in ef core?在 ef 核心中使用流利的 api 映射身份基类的正确方法?
【发布时间】:2018-08-12 00:17:06
【问题描述】:

如果我想将实体作为主键,我必须如何在 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”的属性,因为它被配置为导航属性。 属性只能用于配置标量属性。

我知道我可以使用 OwnsOne,但如果我这样做,我就不会创建身份主键,对吧?

【问题讨论】:

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


    【解决方案1】:

    您的对象应如下所示

    对象类

    public class Product
      {
        public int Id { get; set; }
        public string Name { get; set; }
        ...
      }
    

    默认情况下,实体框架将查找名为 Id 或 ProductId 的对象,并自动将其设为主键。因此,虽然不需要在 DbContext 中设置密钥,但您可以这样做。我一般不会设置 Id,除非它是一个不同的名字。

    数据库上下文

    protected override void OnModelCreating(ModelBuilder builder)
        {
          base.OnModelCreating(builder);
          builder.Entity<Product>().HasKey(x => x.Id);
        }
    

    ** 更新 **

    如果您没有在 db 上下文中设置 DbSet,那么您确实必须在 OnModelCreating 调用中设置 id,以便迁移将对象识别为实体对象

    【讨论】:

    • 是的,但我想知道是否可以从身份基类中提取 id 并告诉 EF ProductId 在 id 中我做了一些技巧,我放了一个属性 private string Id { get {return productId.id} set { ProductId = new ProductId(id); }} 但是我不知道我觉得我做错了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2013-10-28
    • 2017-05-11
    • 2021-05-15
    • 2021-06-24
    • 2021-06-11
    相关资源
    最近更新 更多