EntityTypeにはキー定義エラーがありません


145

コントローラ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcApplication1.Controllers
{
    public class studentsController : Controller
    {
        //
        // GET: /students/

        public ActionResult details()
        {
            int id = 16;
            studentContext std = new studentContext();
           student first = std.details.Single(m => m.RollNo == id);
            return View(first);
        }

    }
}

DbContextモデル:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace MvcApplication1.Models
{
    public class studentContext : DbContext
    {
        public DbSet<student> details { get; set; }
    }
}

モデル:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcApplication1.Models
{
    [Table("studentdetails")]
    public class student
    {
        public int RollNo;
        public string Name;
        public string Stream;
        public string Div;
    }
}

データベーステーブル:

CREATE TABLE [dbo].[studentdetails](
    [RollNo] [int] NULL,
    [Name] [nvarchar](50) NULL,
    [Stream] [nvarchar](50) NULL,
    [Div] [nvarchar](50) NULL
)  

global.asax.cs

Database.SetInitializer<MvcApplication1.Models.studentContext>(null);

上記のコードは、私が取り組んでいるすべてのクラスをリストしています。アプリケーションを実行すると、エラーが発生します。

「エンティティタイプにキーが定義されていません」とともに「モデル生成中に1つ以上の検証エラーが検出されました」。


3
リポジトリファイルを確認してください。このページのすべてのソリューションは素晴らしいですが、私の場合、すべてを正しく行いましたが、テーブルをDbSetとして宣言し、modelbuilder.configurationsに追加するのを忘れていました。
Tosh

私の場合、コードを別のdbにポイントし、テーブルがdbから欠落していた
Kristina Lex

回答:


168

Modelクラスを次のように変更する必要があります。

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    [Table("studentdetails")]
    public class student
    {
        [Key]
        public int RollNo { get; set; }

        public string Name { get; set; }

        public string Stream { get; set; }

        public string Div { get; set; }
    }
}

1
私のコードは([Key]データなしで)データ型を変更する(私はそれらをに変更したunsigned)まで機能し、バイトのみが機能しましたが、unsigned値を使用できない理由はありますか?
Mihai Bratulescu 2014年

5
Entity Frameworkは符号なし整数msdn.microsoft.com/en-us/library/vstudio/…を
user2316116 '30

1
MVCでモデルとして使用している場合は、再構築することを忘れないでください!
RoJaIt

1
このエラーはさまざまな原因で発生する可能性があります。私の場合、「Id」フィールドに「public」(Java / JPAの習慣)ではなく「private」と誤ってマークしました。以下のラリー・レイモンドの回答は、間違いなくこの質問に対する「最良の」回答です。「EntityTypeにはキー定義エラーがありません」の背後にある一般的なシナリオのほとんどがリストされています。
paulsm4

98
  1. Studentクラスのパブリックメンバーがプロパティ w / として定義されていることを確認してください{get; set;}(あなたはパブリック変数です -よくある間違いです)。

  2. [Key]選択したプロパティの上に注釈を配置します。


これが私の問題でした。ありがとう。私はIDのゲッターのみを必要とするインターフェイスを実装していました
Henry Ing-Simmons

81

これが発生する理由はいくつかあります。これらのいくつかはここで見つけまし、他は私が自分で発見しました。

  • プロパティの名前が以外の場合Idは、[Key]属性を追加する必要があります。
  • キーはフィールドではなくプロパティである必要があります。
  • キーは public
  • キーはCLS準拠のタイプである必要があります。つまりuintulongなどの符号なしタイプは許可されません。
  • このエラーは、構成の誤りが原因で発生する場合もあります

3
また、キープロパティは読み書き可能でなければならないこともわかりました。IDプロパティにゲッターがありセッターがない場合、OPのエラーが発生しました。
JohnFx 2016

1
@JohnFxは完全に正しいです。private setクリーンアップ中に一部のプロパティからResharperが削除されました。その結果、「EntityTypeにはキー定義エラーがありません」でした。したがって、必要なコードを削除するクリーンアップツールに注意してください。
jeremysawesome 2017

私の場合、クラスのIDを示すために、無関係な名前を使用しました。あなたの解決策で述べたようにそれを変更すると、私の問題が解決しました。
ありがとうございました

あなたのような任意のプロパティを使用する場合はIDIdClassNameIDClassNameIdあなたは使用する必要はありません必要がある[Key] attribute
Pranav Bilurkar

21

私はこの投稿が遅れていることを知っていますが、この解決策は私を助けました:

    [Key]
    [Column(Order = 0)]
    public int RoleId { get; set; }

[Key]の後に[Column(Order = 0)]を追加します。1ずつ追加できます。

    [Key]
    [Column(Order = 1)]
    public int RoleIdName { get; set; }

等...


これは私にとってはトリックでした。[Key]はすでにありましたが、注文を追加すると解決しました。
Jaitsujin

19

私の場合、「Entity Frameworkを使用したビュー付きMVC 5コントローラー」を作成するとエラーが発生しました。

Modelクラスを作成した後でプロジェクトをビルドするだけで、[Key]アノテーションを使用する必要はありませんでした。


2
はい-'次に、プロジェクトをビルドします。Web APIの足場はリフレクションを使用してモデルクラスを見つけるため、コンパイルされたアセンブリが必要です。このページ
アダム

丁度。「ビルド」のみが機能し、他の以前の答えはどれも機能しません。私はかなり多くの方法を試し、最後にそれを構築し、それはうまくいきました!それから私はここに来て、この答えを見つけました、それは正しい答えです。
William Hou

すごい。これは私のビルドで、ビルドがすべて解決された後
alhpe

はい...。ありがとう....これは、新しく更新されたVS2019:D
JanBorup

11

[キー]を使用してもうまくいきませんでしたが、idプロパティを使用するとうまくいきました。このプロパティをクラスに追加するだけです。

public int id {get; set;}

1
にする必要[Key]がありますが、「id」というプロパティも機能します。
マイケルブラックバーン

public int Id {get; セットする; }または[キー] ^ public int Id1 {get; セットする; }
溶岩

6

オブジェクトには、として使用されるフィールドが含まれている必要があります。Primary Key名前の付いたフィールドがある場合Id、これはデフォルトでEntity Frameworkがリンクするオブジェクトの主キーになります。

それ以外の場合は、[Key]として使用するフィールドの上に属性Primary Keyを追加する必要があります。また、名前空間も追加する必要がありますSystem.ComponentModel.DataAnnotations

public class myClass
{
    public int Id { get; set; }
    [Key]
    public string Name { get; set; }
}

https://stackoverflow.com/a/51180941/7003760


ありがとう!System.ComponentModel.Annotations Nugetパッケージを単体テストプロジェクトに追加すると、このエラーが修正されました。私はDbMigrator Updateを呼び出していましたが、モデルとDbContextを含むドメインプロジェクトにNuget参照があったにもかかわらず失敗しました。どちらのプロジェクトでも必要です。
pwhe23

4

さらに、このような公開キーワードを追加することを忘れないでください

[Key] 
int RoleId { get; set; } //wrong method

このような公開キーワードを使用する必要があります

[Key] 
public int RoleId { get; set; } //correct method

2

EFフレームワークが「キーなし」を要求する理由は、EFフレームワークがデータベースに主キーを必要とするためです。キーがどのプロパティであるかを宣言的にEFに伝えるには、[Key]注釈を追加します。または、最も簡単な方法は、IDプロパティを追加することです。次に、EFフレームワークはIDデフォルトで主キーとして使用されます。


データベースにIDのサフィックスが付いた複数のフィールドがある場合はどうなりますか?再生時にキー属性が失われます。
リチャードグリフィス

DBからコードを生成する場合、テーブルの列の1つがテーブルの主キーである必要があります。
マイケルブラックバーン

生成されたコードの「編集」に関しては、ほとんどの場合、partialクラスとして生成されます。partial同じ名前のクラスとして2番目のファイルを作成し、[Key]属性を使用してプロパティを再度追加できます。
マイケルブラックバーン2016年

1

常にキー属性を使用する必要はありません。マッピングファイルがキーを正しくアドレス指定したことを確認してください

this.HasKey(t => t.Key);
this.ToTable("PacketHistory");
this.Property(p => p.Key)
            .HasColumnName("PacketHistorySK");

リポジトリのOnModelCreatingにマッピングを追加することを忘れないでください

modelBuilder.Configurations.Add(new PacketHistoryMap());

1

私にとって、モデルは大丈夫でした。これは、2つの異なるバージョンのエンティティフレームワークがあったためです。Webプロジェクト用の1つのバージョンと、モデルを含む共通プロジェクト用の別のバージョン。

nugetパッケージ統合する必要がありました

ここに画像の説明を入力してください

楽しい!


「nugetパッケージを統合する」とはどういう意味ですか?私はこれについて聞いたことがありません...
ロブワシントン

0

すべてが正しいですが、私の場合、このような2つのクラスがあります

namespace WebAPI.Model
{
   public class ProductsModel
{ 
        [Table("products")]
        public class Products
        {
            [Key]
            public int slno { get; set; }

            public int productId { get; set; }
            public string ProductName { get; set; }

            public int Price { get; set; }
}
        }
    }

上位クラスを削除した後、それは私にとってはうまくいきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.