2013-08-03 28 views
6

Tôi có cơ sở dữ liệu với 80 bảng (mỗi bảng có khoá chính). Tôi đã tạo ra mô hình trong dự án ASP.NET MVC từ cơ sở dữ liệu (Add - New Item - ADO.NET Entity Data Model). Nhưng trong mô hình tạo ra tôi có 80 lớp (cho mỗi bảng trong cơ sở dữ liệu) mà không thuộc tính [Key] ví dụ:cơ sở dữ liệu đầu tiên - EntityType xxx không có khóa được xác định. Xác định khóa cho EntityType

//------------------------------------------------------------------------------ 
// <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; } 
    } 
} 

Vì vậy, tôi có lỗi: EntityType xxx không có khóa xác định. Xác định khóa cho EntityType này.

Tôi thường thay đổi cơ sở dữ liệu và sau đó mô hình trong dự án để Tôi không thể thêm mỗi thuộc tính [Khóa] vào 80 lớp AUTOGENERATED - tôi có thể làm gì ??

+0

Tại sao bạn mong đợi thuộc tính '[Key]' khi bạn sử dụng DB-Trước? Thuộc tính chỉ dành cho Code-First. Đối với DB-Đầu tiên, tất cả siêu dữ liệu được lấy từ tệp edmx. Bạn có xóa tệp này không? Bạn có thay đổi chuỗi kết nối và xóa các tham chiếu edmx khỏi đó không? – Slauma

+0

Trong tệp edmx, tôi có PK được đặt là Danh tính, nhưng trong các tệp được tạo tự động trong Model.tt Tôi không có thuộc tính [Key] trong các lớp. – michael

+0

Như đã nói, các mô hình dự kiến ​​không có thuộc tính [Key]. Điều gì về bối cảnh được tạo ra? Nó có chứa phương thức 'OnModelCreating' với' UnintentionalCodeFirstException' không? – Slauma

Trả lời

10

Tôi đã có cùng một vấn đề và giải quyết nó bằng cách thêm các thuộc tính [Key] vào mỗi lớp, nhưng để tránh làm điều này bằng tay, tôi đã sửa đổi tệp .tt được sử dụng để tạo mỗi lớp. Tôi đã thêm một điều kiện if trong vòng lặp mà lặp qua từng thuộc tính đơn giản của lớp. Nó thêm chuỗi "[Key]" trước mỗi trường khóa chính. Nếu bạn có một bảng với nhiều trường tạo nên PK thì bạn phải tự thêm các thuộc tính cho điều này ([Key, Column (Order = 0)]) hoặc tiếp tục làm việc để cập nhật tệp .tt (tôi quá lười vì tôi chỉ có một bảng cho đến nay với một khóa tổng hợp). Sau khi hoàn tất, tôi đã lưu tệp .tt và nó đã tạo lại tất cả các lớp của tôi và các lỗi này đã biến mất.

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

Điều này làm việc cho tôi, mặc dù tôi đã hoàn toàn đủ điều kiện 'Key' với không gian tên của nó. Tiếp theo, tìm hiểu cách tạo lại tệp EDMX và tự động bao gồm thuộc tính này. –

5

Để mở rộng câu trả lời của @ Kelly, tôi cũng phải thay đổi mẫu và vì mẫu được tạo từ mẫu khác, bạn cần thay đổi nguồn. Có một mẫu nguồn cho mỗi người trong số các ngôn ngữ được hỗ trợ nhưng tôi nghi ngờ hầu hết mọi người sẽ có thể nhận được bởi với việc thay đổi mẫu tiếng Anh mà được biểu thị bằng các LCID 1033.

Các tập tin tôi tìm thấy là:

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 

Và để đặt đoạn mã cần thiết trong bối cảnh tốt hơn, đây là những gì phần Thuộc tính đơn giản của tôi thay đổi để:

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

      } 
#> 
    <#=codeStringGenerator.Property(edmProperty)#> 
<# 
        } 
    } 
8

Nếu mô hình của bạn có chứa bất kỳ bảng với nhiều khóa chính, bạn sẽ cần phải thêm chú thích Column cho bạn .tt cũng gần đường 66 như sau:

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)#> 
<# 
    } 
} 
Các vấn đề liên quan