C# 为什么每个表都必须有一个主键?

C# 为什么每个表都必须有一个主键?,c#,sql-server,entity-framework,primary-key,C#,Sql Server,Entity Framework,Primary Key,首先,我的问题基于给出的答案 我有一个没有创建主键的表。此表用于记录日志。 使用EntityFramework(v6.0)将新记录添加到此表时,我遇到以下错误: EntityFramework.dll中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的异常,但未在用户代码中处理 其他信息:无法更新EntitySet“Status”,因为它具有DefiningQuery,并且元素中不存在支持当前操作的元素 经过一些搜索后,我发现出现

首先,我的问题基于给出的答案

我有一个没有创建主键的表。此表用于记录日志。 使用EntityFramework(v6.0)将新记录添加到此表时,我遇到以下错误:

EntityFramework.dll中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的异常,但未在用户代码中处理 其他信息:无法更新EntitySet“Status”,因为它具有DefiningQuery,并且元素中不存在支持当前操作的元素

经过一些搜索后,我发现出现此错误是因为我的表没有主键。 我知道我可以通过向表中添加主键来修复此错误。但我想知道为什么

问题: 如果我的设计不需要在表中使用主键,为什么EntityFramework不能使用它

为什么EntityFramework不能处理没有主键的表

这是一个设计决定。实体框架不希望在无法确定行的唯一性时进行更新

他们可以决定支持它,例如为所有列添加
where oldcolN=oldvalN
,但这仍然可能会更新比预期更多的行

为什么EntityFramework不能处理没有主键的表

这是一个设计决定。实体框架不希望在无法确定行的唯一性时进行更新


他们可能已经决定支持它,例如为所有列添加
where oldcolN=oldvalN
,但这仍然可能会更新比预期更多的行。

为什么您必须有一个名称或罪恶?@WillMarcouiller坏问题-名称不是唯一的!为什么我在银行的账户上有账号?@Vladimirs:你找到我了!;-)此外,你的名字和姓氏的完全结合很少是不寻常的,尽管这可能发生。此外,SIN是独一无二的,我已经用它更新了我的评论。=)使用InnoDB,MySQL会给你一个主键,不管你是否定义一个,但我猜这个框架不是MySQL特有的。为什么你必须有一个名字或一个罪?@WillMarcouiller坏问题-名字不是唯一的!为什么我在银行的账户上有账号?@Vladimirs:你找到我了!;-)此外,你的名字和姓氏的完全结合很少是不寻常的,尽管这可能发生。此外,SIN是独一无二的,我已经用它更新了我的评论。=)有了InnoDB,MySQL会给你一个主键,不管你是否定义一个,但我猜这个框架不是MySQL特有的。我没有从这个角度考虑这个问题,很有趣!)最糟糕的情况是RDBMS引擎查看整个行元组以确定唯一性。对于EF来说,通过GetHashCode或类似的东西来做同样的事情并不难。@BrianDriscoll-当两行在所有列中都有相同的值时,那么呢?@hatchet元数据(对于支持它的引擎)。我实际上是从研究生水平的资源(教科书)中获得这些信息的,以免你认为我只是在这里胡说八道。@Brian这感觉就像从你身上找出答案。如果你知道更多,请分享。你指的是什么元数据?在实体框架的数据库不可知、断开连接的模型场景中,元数据是如何适应的?我没有从这个角度考虑这个问题,很有趣!=)最糟糕的情况是RDBMS引擎查看整个行元组以确定唯一性。对于EF来说,通过GetHashCode或类似的东西来做同样的事情并不难。@BrianDriscoll-当两行在所有列中都有相同的值时,那么呢?@hatchet元数据(对于支持它的引擎)。我实际上是从研究生水平的资源(教科书)中获得这些信息的,以免你认为我只是在这里胡说八道。@Brian这感觉就像从你身上找出答案。如果你知道更多,请分享。您所指的元数据是什么?在实体框架的数据库无关的、断开连接的模型场景中,元数据将如何适应?