zoukankan      html  css  js  c++  java
  • Entity Framework 无法对没有主键的视图映射实体的解决办法

    我们在使用Entity Framework的时候经常会把数据库中的某一个视图映射为EF的实体,但是如果数据库视图中的列没有包含表的主键列,EF会报出警告说视图没有主键,导致视图映射为实体失败,错误如下:

    表/视图“{0}”未定义主键,无法推断有效的主键。已排除该表/视图。要使用该实体,您将需要检查架构,添加正确的键并对它取消注释。

    English translation: The table/view '{0}' does not have a primary key defined and no valid primary key could be inferred. This table/view has been excluded. To use the entity you will need to review your schema, add the correct keys and uncomment it.

    这时候我们需要在视图里面用sql的isnull函数生成一列值不能为null的列就行了。

    比如假设现在我们的数据库中本来有一个视图叫V_Customer,它返回的列中没有包含查询表dbo.CustomersBoughtCarsSurvey的主键列,其Sql脚本如下:

    CREATE VIEW [dbo].[V_Customer]
    AS
    SELECT    Name, Age, Sex, Nation, City
    FROM      dbo.CustomersBoughtCarsSurvey

    那么这个视图是无法映射为Entity Framework的实体的,现在我们修改视图增加一个自动生成GUID值的列叫Id,并且使用ISNULL函数确保该列值不为空,脚本如下:

    CREATE VIEW [dbo].[V_Customer]
    AS
    SELECT  ISNULL(NEWID(), 'd1e57ca7-6eee-495a-be13-73d5e7d51f36') AS Id, Name, Age, Sex, Nation, City
    FROM      dbo.CustomersBoughtCarsSurvey

    我们可以看到现在在视图中多了一列id,且是not null的,现在Entity Framework就可以将上面这个视图映射为实体了,并且自动将列Id映射为了实体键

    所以如果要将数据库的一个视图映射为Entity Framework的实体,一定要确保该视图中有一列值是唯一的且是not null的就可以了!

    另外要注意sql的isnull函数第二个参数一定要设置为一个常量视图才认为这列是not null的,比如本例中我们在视图中自定义的列Id是ISNULL(NEWID(), 'd1e57ca7-6eee-495a-be13-73d5e7d51f36') AS Id,isnull函数的第二个参数是写的一个GUID的常量值'd1e57ca7-6eee-495a-be13-73d5e7d51f36',这样SqlServer就会判定列Id肯定不会是null,所以视图定义中最后才会显示列Id是not null的。

    但是如果你将isnull第二个参数定义为一个不确定的值比如一个函数像这样ISNULL(NEWID(), NEWID()) AS Id那么最后SqlServer会认为即便列Id的值使用了isnull函数但是列Id还是有可能为null,所以列Id最后在视图定义中还是显示可以为null。最后该视图还是无法映射为Entity Framework的实体。

  • 相关阅读:
    C#编程(七十九)---------- 反射
    C#编程(七十一)---------- 自定义特性
    C#编程(七十六)----------使用指针实现基于栈的高性能数组
    C#编程(七十五)----------C#使用指针
    微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
    [asp.net]c# winform打印类
    Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
    ValueError: invalid literal for int() with base 10: 'abc'
    检查网址是否正常访问
    Python测试网络连通性示例【基于ping】
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/5111541.html
Copyright © 2011-2022 走看看