7

我有 80 个表的数据库(每个表都有主键)。我已经从数据库(添加 - 新项目 - ADO.NET 实体数据模型)在 ASP.NET MVC 项目中生成了模型。但是在生成的模型中,我有 80 个类(对于数据库中的每个表)没有属性 [Key],例如:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Blog.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Comments
    {
        public int CommentId { get; set; }        
        public string Content { get; set; }
    }
}

所以我有错误: EntityType xxx 没有定义键。定义此 EntityType 的键。

我经常更改数据库,然后在项目中建模,所以我不能每次都将 [Key] 属性添加到 80 个 AUTOGENERATED 类- 我该怎么办?

4

3 回答 3

12

我有同样的问题并通过将 [Key] 属性添加到每个类中来解决它,但为了避免手动执行此操作,我修改了用于生成每个类的 .tt 文件。我在循环中添加了一个 if 条件,该条件循环遍历类的每个简单属性。它在每个主键字段之前添加字符串“[Key]”。如果您有一个包含多个字段组成 PK 的表,那么您必须手动添加此属性 ([Key, Column(Order = 0)]) 或进一步工作以更新 .tt 文件(我太懒了因为到目前为止我只有一个带有复合键的表)。完成后,我保存了 .tt 文件,它重新生成了我的所有类,这些错误就消失了。

foreach (var edmProperty in simpleProperties)
{
        if (ef.IsKey(edmProperty)) { 
#>           [Key]
<#      } 
于 2014-06-05T03:34:14.057 回答
9

如果您的模型包含任何具有多个主键的表,您还需要在Column.tt 文件的第 66 行附近添加注释,如下所示:

var simpleProperties = typeMapper.GetSimpleProperties(entity);
if (simpleProperties.Any())
{
    var keyIndex = 0; // This is a new line
    foreach (var edmProperty in simpleProperties)
    {
        // The following if block is new
        if (ef.IsKey(edmProperty)) 
        {
#>          [System.ComponentModel.DataAnnotations.Key]
            [System.ComponentModel.DataAnnotations.Schema.Column(Order = <#=keyIndex.ToString()#>)]
<#
            keyIndex++;
#>
<#      }
#>
        <#=codeStringGenerator.Property(edmProperty)#>
<#
    }
}
于 2015-03-11T21:43:19.720 回答
5

要扩展@Kelly 的答案,我也必须更改模板,并且由于模板是从另一个模板生成的,因此需要更改源。每种支持的语言都有一个源模板,但我怀疑大多数人都可以通过更改由 LCID 1033 表示的英文模板来解决问题。

我找到的文件是:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplates\CSharp\Data\1033\DbCtxCSEF6\CSharpDbContext.Types.tt                                                                                                                               
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplates\Web\CSharp\1033\DbCtxCSWSEF6\CSharpDbContext.Types.tt                                                                                                                              
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSharp\Data\1033\DbCtxCSEF6\CSharpDbContext.Types.tt                                                                                                                          
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\Web\CSharp\1033\DbCtxCSWSEF6\CSharpDbContext.Types.tt                                                                                                                         
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\VWDExpress\ItemTemplates\CSharp\Data\1033\DbCtxCSEF6\CSharpDbContext.Types.tt                                                                                                                    
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\VWDExpress\ItemTemplates\Web\CSharp\1033\DbCtxCSWSEF6\CSharpDbContext.Types.tt                                                                                                                   
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\WDExpress\ItemTemplates\CSharp\Data\1033\DbCtxCSEF6\CSharpDbContext.Types.tt                                                                                                                     
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\WDExpress\ItemTemplates\Web\CSharp\1033\DbCtxCSWSEF6\CSharpDbContext.Types.tt

为了将所需的代码片段放在更好的上下文中,这就是我的简单属性部分更改为:

    var simpleProperties = typeMapper.GetSimpleProperties(entity);
    if (simpleProperties.Any())
    {
        foreach (var edmProperty in simpleProperties)
        {
            if (ef.IsKey(edmProperty)) 
            { 
#>
    [System.ComponentModel.DataAnnotations.Key]
<#

            }
#>
    <#=codeStringGenerator.Property(edmProperty)#>
<#
        }
    }
于 2014-09-04T07:38:47.800 回答