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);

उपरोक्त कोड उन सभी वर्गों को सूचीबद्ध करता है जिन पर मैं काम कर रहा हूं। मेरे आवेदन को चलाने पर त्रुटि प्राप्त हो रही है:

"मॉडल पीढ़ी के दौरान" एक या अधिक सत्यापन त्रुटियों का पता लगाया गया था "साथ में" एंटिटी प्रकार की कोई कुंजी निर्धारित नहीं है "।


3
रिपॉजिटरी फ़ाइल की जाँच करें। इस पृष्ठ के सभी समाधान अद्भुत हैं लेकिन मेरे मामले में, मैंने सब कुछ ठीक किया लेकिन तालिका को डीबीएससेट घोषित करना और मॉडलबिल्डर में जोड़ना चाहता हूं ।configurations।
तोश

मेरे मामले में, मैंने एक और डीबी को कोड बताया और तालिका डीबी से गायब थी
क्रिस्टीना लेक्स

जवाबों:


168

मॉडल वर्ग को बदल दिया जाना चाहिए:

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मूल्यों का उपयोग नहीं कर सकता हूं ?
मिहाई ब्राटुल्स्कू

5
इकाई फ्रेमवर्क अहस्ताक्षरित पूर्णांक का समर्थन नहीं करता है msdn.microsoft.com/en-us/library/vstudio/…
user2316116

1
और अगर आप इसे MVC में एक मॉडल के रूप में उपयोग कर रहे हैं, तो पुनर्निर्माण करना न भूलें!
RoJaIt

1
विभिन्न चीजों के बहुत सारे इस त्रुटि का कारण बन सकते हैं। मेरे मामले में, मैंने गलती से "सार्वजनिक" (जावा / जेपीए से एक आदत) के बजाय मेरे "आईडी" फ़ील्ड "निजी" को चिह्नित किया। नीचे लैरी रेमंड की प्रतिक्रिया यकीनन इस सवाल का "सर्वश्रेष्ठ" उत्तर है। यह "EntityType की कोई महत्वपूर्ण परिभाषित त्रुटि नहीं है" के पीछे अधिकांश सामान्य परिदृश्यों को सूचीबद्ध करता है।
paulsm4

98
  1. सुनिश्चित करें कि छात्र वर्ग के सार्वजनिक सदस्यों को गुण w / {get; set;}(आपके सार्वजनिक चर - एक सामान्य गलती) के रूप में परिभाषित किया गया है ।

  2. [Key]अपनी चुनी हुई संपत्ति के शीर्ष पर एक एनोटेशन रखें ।


यह मेरी समस्या थी। धन्यवाद। मैं एक इंटरफ़ेस लागू कर रहा था, जिसमें केवल
हेनरी इंग-सिमन्स

81

ऐसा होने के कई कारण हो सकते हैं। इनमें से कुछ मुझे यहां मिले , अन्य जिन्हें मैंने अपने दम पर खोजा।

  • यदि संपत्ति को इसके अलावा कुछ और नाम दिया गया है Id, तो आपको इसमें [Key]विशेषता जोड़ने की आवश्यकता है।
  • कुंजी को एक क्षेत्र नहीं, एक संपत्ति होने की आवश्यकता है।
  • प्रमुख होने की जरूरत है public
  • सीएलएस-अनुरूप प्रकार की कुंजी की आवश्यकता है, जिसका अर्थ है अहस्ताक्षरित प्रकार uint, जैसे ulongआदि की अनुमति नहीं है।
  • यह त्रुटि कॉन्फ़िगरेशन गलतियों के कारण भी हो सकती है

3
मैंने यह भी पाया है कि प्रमुख संपत्ति को पढ़ना-लिखना है। जब मुझे आईडी मिला और आईडी प्रॉपर्टी पर कोई सेटर नहीं था, तो मुझे ओपी की त्रुटि मिली।
JohnFx

1
@ जॉनफैक्स बिल्कुल सही है। private setएक सफाई के दौरान कुछ गुणों से हटाए गए पुनर्विक्रेता । परिणाम "EntityType में कोई महत्वपूर्ण परिभाषित त्रुटि नहीं थी"। इसलिए आवश्यक कोड हटाने वाले सफाई उपकरणों से सावधान रहें।
jeremysawesome

मेरे मामले में, मैंने कक्षा के ईद का उल्लेख करने के लिए कुछ असंबंधित नाम का इस्तेमाल किया। बदलने के रूप में अपने समाधान में वर्णित मेरी समस्या हल हो गई है। थैंक्यू :)
एंजेला अमरपाल

आप की तरह किसी भी संपत्ति का उपयोग करते हैं ID, Id, ClassNameID, ClassNameIdआप का उपयोग करने की जरूरत नहीं की जरूरत है[Key] attribute
प्रणव Bilurkar

21

मुझे पता है कि यह पोस्ट देर से है, लेकिन इस समाधान से मुझे मदद मिली:

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

जोड़ा गया [कॉलम (आदेश = 0)] के बाद [कुंजी] 1 से वेतन वृद्धि द्वारा जोड़ा जा सकता है

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

आदि...


इसने मेरे लिए चाल चली। मेरे पास [कुंजी] पहले से ही थी लेकिन आदेश को जोड़कर इसे हल किया।
जेट्सुजिन

19

मेरे मामले में, मुझे "MVC 5 नियंत्रक को देखने के लिए, एंटिटी फ्रेमवर्क का उपयोग करके" बनाते समय त्रुटि हो रही थी।

मुझे केवल मॉडल वर्ग बनाने के बाद प्रोजेक्ट बनाने की आवश्यकता थी और [कुंजी] एनोटेशन का उपयोग करने की आवश्यकता नहीं थी।


2
हां - 'अगला, परियोजना का निर्माण। वेब एपीआई मचान मॉडल कक्षाओं को खोजने के लिए प्रतिबिंब का उपयोग करता है, इसलिए इसे संकलित विधानसभा की आवश्यकता है। ' इस पृष्ठ
एडम

बिल्कुल सही। केवल "बिल्ड" काम करता है, और अन्य पिछले उत्तरों में से कोई भी नहीं करता है! मैंने कई तरह से कोशिश की और आखिरकार मैंने इसे बनाया और इसने काम किया! फिर मैंने यहां आकर यह उत्तर पाया, जो सही उत्तर है।
विलियम होउ

महान। यह मेरा मामला था, निर्माण के बाद सब हल हो गया
alhpe

हाँ .... धन्यवाद .... अजीब बात है यह एक नए अद्यतन VS2019 में एक मुद्दा है: D
JanBorup

11

[कुंजी] का उपयोग करना मेरे लिए काम नहीं करता था, लेकिन एक आईडी प्रॉपर्टी का उपयोग यह करता है। मैं सिर्फ अपनी कक्षा में इस संपत्ति को जोड़ता हूं।

public int id {get; set;}

1
यह होना चाहिए [Key], लेकिन एक संपत्ति जिसे "कहा जाता है"id " भी काम करेगी।
माइकल ब्लैकबर्न

सार्वजनिक int आईडी {प्राप्त करें; सेट; } या [कुंजी] ^ सार्वजनिक int Id1 {प्राप्त करें; सेट; }
लावा

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

ईएफ फ्रेमवर्क का कारण 'कोई कुंजी नहीं' है, क्योंकि ईएफ ढांचे को डेटाबेस में एक प्राथमिक कुंजी की आवश्यकता होती है। ईएफ को घोषित करने के लिए कि किस संपत्ति की कुंजी है, आप एक [Key]एनोटेशन जोड़ते हैं। या, सबसे तेज़ तरीका, एक IDसंपत्ति जोड़ें । फिर, ईएफ फ्रेमवर्क IDडिफ़ॉल्ट रूप से प्राथमिक कुंजी के रूप में ले जाएगा ।


यदि डेटाबेस में ID के साथ एक से अधिक फ़ील्ड हैं, तो क्या होता है? पुनर्जनन पर मैं कुंजी विशेषता खो देता हूं।
रिचर्ड ग्रिफिथ्स

यदि आप DB से कोड उत्पन्न कर रहे हैं, तो तालिका में एक स्तंभ तालिका की प्राथमिक कुंजी होना चाहिए।
माइकल ब्लैकबर्न

"संपादन" उत्पन्न कोड के बारे में, यह लगभग हमेशा एक partialवर्ग के रूप में उत्पन्न होता है । आप partialउसी नाम से एक वर्ग के रूप में दूसरी फ़ाइल बना सकते हैं , और [Key]गुण के साथ फिर से संपत्ति जोड़ सकते हैं ।
माइकल ब्लैकबर्न

1

आपको हर समय मुख्य विशेषता का उपयोग करने की आवश्यकता नहीं है। सुनिश्चित करें कि मैपिंग फ़ाइल ने कुंजी को ठीक से संबोधित किया है

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

और रिपोजिटरी के ऑनमॉडेलक्रिटिंग में मैपिंग को जोड़ना न भूलें

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

1

मेरे लिए, मॉडल ठीक था। यह इसलिए था क्योंकि मेरे पास इकाई ढांचे के 2 अलग-अलग संस्करण थे। वेब परियोजना के लिए एक संस्करण और सामान्य परियोजना के लिए एक और जिसमें मॉडल शामिल हैं।

मुझे बस नगेट संकुल को समेकित करना था ।

यहाँ छवि विवरण दर्ज करें

का आनंद लें!


"नगेट पैकेज को समेकित करें" से आपका क्या मतलब है? मैंने इसके बारे में कभी नहीं सुना है ....
रोब वाशिंगटन

0

सब सही है लेकिन मेरे मामले में मेरे पास इस तरह के दो वर्ग हैं

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

उच्च वर्ग को हटाने के बाद यह मेरे लिए ठीक काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.