2012-12-13 21 views
34

基本的なASP.net MVC 4アプリケーションを開発する。EntityType 'Category'にはキーが定義されていません。このEntityTypeのキーを定義する

'Products'テーブルに 'Category id'(カテゴリテーブルのプライマリキー)の外部キーリファレンスがあります。これは、2つのデータベーステーブル( 'カテゴリ'と '製品' 。

アプリケーションを実行すると、エラーメッセージが表示されます(下記参照)。

System.Data.Entity.Edm.EdmEntityType: : EntityType 'Category' has no key defined. Define the key for this EntityType. 

System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'Category' is based on type 'Category' that has no keys defined 

これは初心者のための一般的なエラーのように見えますが、私は「エンティティキー 『に関連するすべてのソリューションをチェックしなかった』定義されたキーを持っていません。」しかし、まだ私の問題は解決されていません、この問題の理解に役立ち、この問題の正しい解決策は何ですか?

以下は私のモデルクラスです

Category.cs

namespace ChemicalStore.Models 
{ 
    public partial class Category 
    { 
     public int CatId { get; set; } 
     public string CatName { get; set; } 
     public string CatDescription { get; set; } 
     public List<Product> Product { get; set; } 
    }  
} 

Products.csあなたは、プロパティCATID前に属性[キー]を追加する必要があります

namespace ChemicalStore.Models 
{ 
    public class Product 
    { 
     public int ProductId { get; set; } 
     public int CatId { get; set; } 
     public string ProductTitle { get; set; } 
     public string ProductPrice { get; set; } 
     public string ProductDescription { get; set; } 
     public string ProductPackage { get; set; } 
    } 
} 
+0

hmm ..なぜこの質問は、後の質問の重複としてマークされていますか? –

答えて

72

 using System.ComponentModel.DataAnnotations; 

     public partial class Category 
     { 
      [Key] 
      public int CatId { get; set; } 
      public string CatName { get; set; } 
      public string CatDescription { get; set; } 
      public List<Product> Product { get; set; } 
     } 

EFは、テーブルの主キーを認識している場合にのみ動作するという問題があります。デフォルトでは、EFはnameという名前のプライマリキープロパティとして認識します。テーブルに別の主キーがある場合は、属性[Key]でマークするか、流暢な設定でKeyを設定します。

+2

完全合意。従来、MVCは "CategoryId"というプロパティを期待していましたが、代わりに "CatId"を置くので、データ注釈を使用し、 "CatId"に[Key]を入れてMVCがそれをモデルカテゴリのプライマリキーとして認識させる必要があります。 – Nestor

+0

本当にありがとうございました。私は初心者です。これで私はさらに欲求不満から救われました。 – Apollo

+0

私は同じエラーがあります。しかし、私は慣習を尊重していることを確認します。私の財産は 'public int AccountRoleId'です。他にアイデアはありますか? – Kael

12

Entity Frameworkは、主キーフィールドを使用して、生成されたテーブルに主キー列を作成します。

それはいくつかのバリエーションで、この列を取得するための規則を使用しています。

  • フィールドがidまたは任意の筐体の分散と呼ばれている場合は、
  • フィールドのケーシング分散がClassNameIdの場合、

私はいくつかの慣習を逃しているかもしれませんが、これが最も一般的なケースです。

あなたは属性[Key]をご希望の主キーをマークする必要があり、この規則を持つ任意のフィールドがない場合は:ただ上記IDの[キー]属性を配置

[Key] 
public int CatId { get; set; } 
7

を...

[Table("employee")] 

public class Employee 
{ 

    [Key] 

    public int Empno { set; get; } 

    public string Empname { set; get; }  
} 
0

エンティティクラスがあれば...それらのファイルに

マニュアルの変更が上書きされる自動生成され、コードが再生成されます。

は、あなたがエラーの下に取得している場合は、よりMSDN

+2

OPはコードファーストアプローチを使用しているようです。だから、この答えは当てはまりません。 – FrankO

0

こんにちは上のすべてのメタデータ

[MetadataType(typeof(Category.CategoryMetadata))] 
    public partial class Category 
    { 
     internal sealed class CategoryMetadata 
     { 
      [Key] 
      public int CatId { get; set; } 
      [Required] 
      public string CatName { get; set; } 
      public string CatDescription { get; set; } 
      public List<Product> Product { get; set; } 
     } 
    } 

読むとパーシャルクラスを作成する必要があります。 ""モデル生成中に1つ以上の検証エラーが検出されました:

Checking.Models.Employee :: EntityType 'Employee'にはキーが定義されていません。このEntityTypeのキーを定義してください。 "" テーブルの列名と定義されたプロパティ名を同じにしてください。 それが解決しない場合は解決してください。

0

私の場合、web.config/app.configファイルに正しいconnectionStringを追加してこの問題を修正しました。

DBContextを追加するのを忘れてしまい、DBと通信できませんでした。

は、それは私が私のキープロパティにセッターを追加することによってこの問題を解決することができた

7

をお役に立てば幸いです。私は以前はゲッターしか持っていなかった。

public int Id { get; set; } 
+1

私はゲッター/セッターの欠如もこの例外を発生させることがわかりました。これを "Key"属性と共に指定してください – LargeDachshund

+0

'プライベートセット'で十分です –

関連する問題