我收到此错误
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
。
为什么?
答案 0 :(得分:1)
根据定义,“实体”是具有标识符的对象,与“值对象”相反,“值对象”的身份是其所有数据的总和。例如,您可以有一个像这样的类:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
但是,多个人可能具有相同的名字,因此仅FirstName
和LastName
的值不足以唯一地标识一个人。您需要一个明确的标识符:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
现在,您可以区分两个具有相同名称的人。
EF是 Entity 框架并非偶然。从字面上看,这是一个用于处理实体(即带有标识符的对象)的框架。那是您的PK,所有实体都需要,否则它们实际上就不是实体。
如果您真的觉得您不需要PK(尽管我认为该假设值得怀疑),那么EF不是适合您的解决方案。您可能想要使用IDistributedCache
,Session
或NoSQL存储。这些方法中的任何一个都可以让您处理喜欢的任何形式的数据(尽管您需要从JSON序列化到/从JSON序列化)。但是,您可能会发现仍然需要某种形式的ID。
答案 1 :(得分:0)
我认为MyType不需要主键吗?
您需要在EF模型的每个类上拥有一个Key
属性(假设您正在使用DataAnnotations)。这是在基础关系数据库中建立外键关系所必需的。
每当我执行Items.Count()时,我都会收到InvalidOperationException
您仅在.Count()
上收到此错误,还是由于模型无效而在此DbSet上进行的所有操作都抛出相同的异常?