欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EF常见问题

程序员文章站 2024-03-21 16:37:28
...

不理解EF机制的小白,有时候遇到视图添加不到模型编辑器中,很是无解,关键是EF编辑器愣是报一些没有用的错误:

模型已生成,但出现警告或错误。
有关详细信息,请参阅错误列表。运行应用程序前需要修复这些问题。

这些问题归根结底可以用Microsoft官网上的一句话来解答:

每个实体都必须具有唯一实体键内实体集

但是在官网里没有介绍对于视图一些没有表主键的情况,EF生成器是怎么生成模型Key,所以只能自己总结,以下是我总结的三点(可以右键edmx生成器,用xml格式打开模型进行查看):
1.没有主键的单表查询,EF编辑器会默认第一个字段为主键

  CREATE VIEW AA AS 
  SELECT B.Name,B.Mobile FROM [User] B
   <!--生成过程中发现错误:
      警告 6002: 表/视图“TestDB.dbo.AA”未定义主键。已推断出该键,并将定义创建为只读的表/视图。
      -->
        <EntityType Name="AA">
          <Key>
            <PropertyRef Name="Name" />
          </Key>
          <Property Name="Name" Type="varchar" Nullable="false" MaxLength="50" />
          <Property Name="Mobile" Type="varchar" MaxLength="20" />
        </EntityType>

2.多表查询,字段中包含主表主键,则使用主表主键,没有则使用主表中的所有字段作为主键

 CREATE VIEW [dbo].[V_UserInfo] AS 
  SELECT  
  u.Name,
  u.Mobile,
  f.ExTime,
  f.No,
  t.A
  FROM [User] u 
  LEFT OUTER JOIN IdCardInfo f ON f.UserId=u.UserId
  LEFT OUTER JOIN TableB t ON t.Id=f.Id
 <!--生成过程中发现错误:
      警告 6002: 表/视图“TestDB.dbo.V_UserInfo”未定义主键。已推断出该键,并将定义创建为只读的表/视图。
      -->
 <EntityType Name="V_UserInfo">
          <Key>
            <PropertyRef Name="Name" />
            <PropertyRef Name="Mobile" />
          </Key>
          <Property Type="String" Name="Name" MaxLength="50" />
          <Property Type="Int32" Name="Mobile" Nullable="false" />
          <Property Type="Int32" Name="ExTime" Nullable="false" />
          <Property Type="Int32" Name="No" Nullable="false" />
          <Property Type="Int32" Name="A" Nullable="false" />
</EntityType>

3.多表查询+GROUP BY 的视图,默认使用GROUP BY 的字段作为键值

 CREATE VIEW [dbo].[V_CountUser] AS 
  SELECT  
  f.ExTime,
  f.Type,
  COUNT(u.UserId) AS UserCount
  FROM [User] u 
  LEFT OUTER JOIN IdCardInfo f ON f.UserId=u.UserId
  LEFT OUTER JOIN TableB t ON t.Id=f.Id
  GROUP BY F.ExTime,F.Type
 <!--生成过程中发现错误:
      警告 6002: 表/视图“TestDB.dbo.V_UserInfo”未定义主键。已推断出该键,并将定义创建为只读的表/视图。
 <EntityType Name="V_CountUser">
          <Key>
            <PropertyRef Name="ExTime" />
            <PropertyRef Name="Type" />
          </Key>
          <Property Type="DateTime" Name="ExTime" Precision="3" />
          <Property Type="Int32" Name="Type" Nullable="false" />
          <Property Type="Int32" Name="UserCount" Nullable="false" />
  </EntityType>