我有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类 - 我该怎么办?
答案 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)#>
<#
}
}