web-dev-qa-db-ja.com

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

コントローラー:

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つ以上の検証エラーが検出されました」.

132
Coder

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; }
    }
}
151
Coder
  1. 学生クラスのパブリックメンバーがプロパティw/{get; set;}として定義されていることを確認してください(あなたのクラスはパブリック変数です - よくある間違い).

  2. 選択したプロパティの上に[Key]アノテーションを配置します。

90
Larry Raymond

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

  • プロパティの名前がId以外の場合は、[Key]属性を追加する必要があります。
  • キーはフィールドではなくプロパティである必要があります。
  • キーはpublicである必要があります
  • キーはCLS準拠の型である必要があります。つまり、uintulongなどの符号なし型は許可されません。
  • このエラーは 設定ミス によっても引き起こされる可能性があります。

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

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

[Key]の後ろに[Column(Order = 0)]を追加することで、1ずつ増やすことができます。

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

等...

19
danigitman

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

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

16
ChrisS

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

public int id {get; set;}
8
William Bello

EFフレームワークが「キーなし」を要求するのは、EFフレームワークがデータベースに主キーを必要とするからです。 EFにどのプロパティがキーであるかを宣言的に伝えるには、[Key]アノテーションを追加します。あるいは、最速の方法は、IDプロパティを追加することです。その後、EFフレームワークはデフォルトでIDを主キーとして扱います。

2
UtillYou

オブジェクトに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

2
Mayer Spitzer

さらに覚えておいて、このようなpublicキーワードを追加することを忘れないでください

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

あなたはこのようなPublicキーワードを使わなければなりません

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

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

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

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

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

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

私はnugetパッケージを統合しなければなりませんでした

enter image description here

楽しい!

0
Daniel

すべて正しいですが、私の場合はこのようなクラスが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; }
}
        }
    }

上流階級を削除した後、それは私のためにうまく働きます。

0
Debendra Dash