数据库优先 - EntityType xxx没有定义键。定义此EntityType的键

时间:2013-08-03 17:50:58

标签: asp.net-mvc entity-framework

我有80个表的数据库(每个表都有主键)。我在ASP.NET MVC项目中从数据库生成模型(Add - New Item - ADO.NET Entity Data Model)。但是在生成的模型中,我有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类 - 我该怎么办?

3 个答案:

答案 0 :(得分:10)

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

foreach (var edmProperty in simpleProperties)
{
        if (ef.IsKey(edmProperty)) { 
#>           [Key]
<#      } 

答案 1 :(得分:8)

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

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)#>
<#
    }
}

答案 2 :(得分: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)#>
<#
        }
    }