Asp.net 视图、实体无法推断主键

Asp.net 视图、实体无法推断主键,asp.net,sql-server,entity-framework,Asp.net,Sql Server,Entity Framework,我做了一个视图,这样我的网站的背面就更连贯了。然后我尝试将它映射到我的实体模式 我得到的信息是: 未定义主键,无法推断主键,表已排除 所以我做了一个!我通过组合3列来确保它的独特性,这3列在组合时不能完全相同。我把这个新栏目叫做“id” 实体似乎不同意我的“id”的唯一方面,因为错误消息不会消失,我无法导入我的视图…好吧,我必须在我的“id”列上使用sql函数ISNULL(id),使其成为非null值,以便实体理解它永远不可能为null,因此,将它检测为一个潜在的主键好吧,我必须在我的“id”列

我做了一个视图,这样我的网站的背面就更连贯了。然后我尝试将它映射到我的实体模式

我得到的信息是:

未定义主键,无法推断主键,表已排除

所以我做了一个!我通过组合3列来确保它的独特性,这3列在组合时不能完全相同。我把这个新栏目叫做“id”


实体似乎不同意我的“id”的唯一方面,因为错误消息不会消失,我无法导入我的视图…

好吧,我必须在我的“id”列上使用sql函数ISNULL(id),使其成为非null值,以便实体理解它永远不可能为null,因此,将它检测为一个潜在的主键

好吧,我必须在我的“id”列上使用sql函数ISNULL(id),使它成为一个非null值,以便实体理解它永远不会为null,因此,将它检测为一个潜在的主键

这不是EF的工作。“id”应该是代码优先约定之后的键,如果不是,则应该使用数据注释或fluent API将其声明为键。然而,当您必须使用sql时,这将建议使用DB优先的方法。在这里,每个表都必须有一个NOTNULL PK列组合,因此如果元数据中出现错误,EF可以预期模型不正确(它将无法使用元数据重新创建表)并将其排除。我使用db first方法是的,但您知道,通常我会在视图中以唯一字段(主键)结束。在这种情况下,我甚至不必指定witch列是一个潜在的主键,Entity为我做这项工作,并决定witch字段组合将代表视图中最好的主键,但这次我没有任何(非null)唯一值,所以我创建了一个,并指定它不能为null。。。我知道这很奇怪,但它是有效的。如果它知道任何名为“Id”或TypeName(+'''.')+“Id”的属性都是待创建属性的主键,如果不是这种情况,您必须指定它,我认为它不会识别任何其他组合,因为它不知道哪些属性是所有行的唯一标识符。如果您先编写代码,您可以采用任何不可为null的属性组合(可以映射到单个列),并使用data annotation/fluent api将它们指定为键。我验证过,这不适用于DB first这不是EF的工作。“id”应该是代码优先约定之后的键,如果不是,则应该使用数据注释或fluent API将其声明为键。然而,当您必须使用sql时,这将建议使用DB优先的方法。在这里,每个表都必须有一个NOTNULL PK列组合,因此如果元数据中出现错误,EF可以预期模型不正确(它将无法使用元数据重新创建表)并将其排除。我使用db first方法是的,但您知道,通常我会在视图中以唯一字段(主键)结束。在这种情况下,我甚至不必指定witch列是一个潜在的主键,Entity为我做这项工作,并决定witch字段组合将代表视图中最好的主键,但这次我没有任何(非null)唯一值,所以我创建了一个,并指定它不能为null。。。我知道这很奇怪,但它是有效的。如果它知道任何名为“Id”或TypeName(+'''.')+“Id”的属性都是待创建属性的主键,如果不是这种情况,您必须指定它,我认为它不会识别任何其他组合,因为它不知道哪些属性是所有行的唯一标识符。如果您先编写代码,则可以采用不可为null的属性(可以映射到单个列)的任意组合,并使用data annotation/fluent api将这些属性指定为键