为什么实体类型”需要定义主键?

时间:2019-08-29 16:33:49

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

我收到此错误

  

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<ContainerType> Items,但是每当我执行Items.Count()时,我都会得到InvalidOperationException

为什么?

2 个答案:

答案 0 :(得分: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序列化到/从JSON序列化)。但是,您可能会发现仍然需要某种形式的ID。

答案 1 :(得分:0)

  

我认为MyType不需要主键吗?

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

  

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

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