【问题标题】:Why does the entity type '' require a primary key to be defined?为什么实体类型 '' 需要定义主键?
【发布时间】:2019-08-30 01:49:32
【问题描述】:

我收到了这个错误

System.InvalidOperationException:实体类型“MyType”需要定义主键

尝试使用 DbContext、DbSet 等

我认为 MyType 不需要主键吗?

为什么我被告知要给它一个主键...

我创建了一些看起来像的模型

public ContainerType
{
  public string Id { get; set; }
  public int SomeData { get; set; }

  public MyType Foo { get; set; }
  public MyType Bar { get; set; }
}

public MyType
{
  public string SomeProperty { get; set; }
  public List<OtherType> OtherTypes { get; set; }
}

我尝试创建DbSet&lt;ContainerType&gt; Items,但每当我创建Items.Count() 时,我都会得到InvalidOperationException

为什么?

【问题讨论】:

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


    【解决方案1】:

    根据定义,“实体”是具有标识符的对象,与“值对象”相反,“值对象”的标识是其所有数据的总和。例如,您可以有这样的类:

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    但是,多个人可能具有相同的姓名,因此仅FirstNameLastName 的值不足以唯一标识一个人。你需要一个明确的标识符:

    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    现在,您可以区分同名的两个不同的人。

    EF 是 Entity 框架并非巧合。它实际上是一个处理实体的框架,即具有标识符的对象。这是您的 PK,它是所有实体必需的,否则它们实际上就不是实体。

    如果您真的觉得不需要 PK(尽管我认为该假设值得怀疑),那么 EF 不是适合您的解决方案。您可能希望使用 IDistributedCacheSession 或 NoSQL 存储。其中任何一个都允许您使用您喜欢的任何形式的数据(尽管您需要序列化到/从 JSON 序列化)。但是,您可能会发现您仍然需要某种类型的 id。

    【讨论】:

      【解决方案2】:

      我认为 MyType 不需要主键?

      您需要一个 Key 属性(假设您正在使用 DataAnnotations)属性在您的 EF 模型的每个类上。这是在底层关系数据库中设置外键关系所必需的。

      每当我执行 Items.Count() 时,我都会收到 InvalidOperationException

      您是仅在 .Count() 上收到此错误,还是由于模型无效而对该 DbSet 进行的所有操作都抛出相同的异常?

      【讨论】:

      • 可能全部,到目前为止我只尝试过使用.Count()。为什么我的 EF 模型中的每个类都需要 Key 属性属性?
      • 促进数据库记录之间的关系。
      • 即使在我的模型中它们只是属性和列表?如果它需要创建一些关系数据库,为什么它不能自己添加主键......我不会使用它们......
      • 也许我使用了错误的存储方式,我只是复制了一些示例代码并尝试重新调整它的用途。我想我不应该在这里使用 DbContext?
      猜你喜欢
      • 1970-01-01
      • 2021-07-23
      • 2021-11-27
      • 2018-08-13
      • 2019-09-13
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多