সত্তা টাইপের কোনও কী সংজ্ঞায়িত ত্রুটি নেই


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
সংগ্রহস্থল ফাইলটি পরীক্ষা করুন। এই পৃষ্ঠার সমস্ত সমাধানগুলি আশ্চর্যজনক তবে আমার ক্ষেত্রে, আমি সবকিছু ঠিকঠাক করেছি তবে টেবিলটিকে ডিবিসেট হিসাবে ঘোষণা করতে এবং মডেলবিল্ডার কনফিগারেশনে যুক্ত করতে ভুলে গিয়েছি।
তোশ

আমার ক্ষেত্রে, আমি কোডটি অন্য একটি ডিবিতে দেখিয়েছিলাম এবং টেবিলটি ডিবি থেকে অনুপস্থিত ছিল
ক্রিস্টিনা

উত্তর:


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
সত্তা ফ্রেমওয়ার্ক স্বাক্ষরবিহীন পূর্ণসংখ্যার এমএসডিএন.ইমিক্রোসফটি.এইনস
লিবারি

1
এবং যদি আপনি এটি এমভিসিতে মডেল হিসাবে ব্যবহার করছেন তবে পুনরায় নির্মাণ করতে ভুলবেন না!
RoJaIt

1
প্রচুর বিভিন্ন জিনিস এই ত্রুটি ঘটাতে পারে। আমার ক্ষেত্রে, আমি ভুলভাবে আমার "আইডি" ফিল্ডটিকে "পাবলিক" (জাভা / জেপিএর অভ্যাস) এর পরিবর্তে "ব্যক্তিগত" চিহ্নিত করেছি। নীচে ল্যারি রেমন্ডের প্রতিক্রিয়াটি এই প্রশ্নের পক্ষে যুক্তিযুক্ত "সেরা" জবাব। এটি "সত্তা টাইপের কোনও কী সংজ্ঞায়িত ত্রুটি নেই" এর পিছনে বেশিরভাগ সাধারণ দৃশ্যের তালিকা করে।
পলস্ম 4

98
  1. করুন ছাত্র ক্লাসের নিশ্চিত প্রকাশ্য সদস্য হিসেবে সংজ্ঞায়িত করা হয় বৈশিষ্ট্য W / {get; set;}(পুলিশের সর্বজনীন ভেরিয়েবল - একটি সাধারণ ভুল)।

  2. [Key]আপনার নির্বাচিত সম্পত্তির উপরে একটি টিকা দিন।


এটা আমার সমস্যা ছিল। ধন্যবাদ। আমি একটি ইন্টারফেস বাস্তবায়ন করছিলাম যার জন্য কেবল আইডির জন্য একজন গেটর প্রয়োজন
হেনরি ইং-সিমন্স

81

এটি ঘটতে পারে বিভিন্ন কারণ আছে। এর মধ্যে আমি এখানে কিছু খুঁজে পেয়েছি , অন্যরা নিজেরাই আবিষ্কার করেছি।

  • সম্পত্তি ব্যতীত অন্য কিছু নামকরণ করা হয় তাহলে Id, আপনি যোগ করতে হবে [Key]এটি অ্যাট্রিবিউট।
  • কীটি ক্ষেত্র নয়, সম্পত্তি হতে হবে।
  • চাবিটি হওয়া দরকার public
  • কী প্রয়োজন একটি CLS-অনুবর্তী টাইপ হতে, যার অর্থ স্বাক্ষরবিহীন ধরনের পছন্দ uint, ulongইত্যাদি অনুমতি দেওয়া হয়নি।
  • এই ত্রুটিটি কনফিগারেশন ত্রুটির কারণেও হতে পারে ।

3
আমি এটিও পেয়েছি যে মূল সম্পত্তিটি পড়তে হবে। আইডি সম্পত্তিতে কোনও গেটর এবং কোনও সেটটার না থাকায় আমি ওপি'র ত্রুটি পেয়েছি।
জনএফএক্স

1
@ জনফএক্স একেবারে সঠিক। private setএকটি পরিষ্কারের সময় কিছু সম্পত্তি থেকে পুনঃ ভাগ করা সরানো হয়েছে। ফলাফলটি ছিল "সত্ত্বা টাইপের কোনও কী সংজ্ঞায়িত ত্রুটি নেই"। সুতরাং প্রয়োজনীয় কোড মুছে ফেলার জন্য ক্লিনআপ সরঞ্জামগুলি থেকে সাবধান থাকুন।
জেরেমেসউইজ

আমার ক্ষেত্রে, আমি ক্লাসের আইডি উল্লেখ করতে কিছু সম্পর্কযুক্ত নাম ব্যবহার করেছি used আপনার সমাধানে উল্লিখিত হিসাবে এটি পরিবর্তন করা আমার সমস্যার সমাধান করেছে।
থানকিউ

তোমার মত কোন সম্পত্তি ব্যবহার করেন তাহলে 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

আমার ক্ষেত্রে, "সত্তা ফ্রেমওয়ার্ক ব্যবহার করে" এমভিসি 5 কন্ট্রোলার দেখার সাথে সাথে তৈরি করার সময় আমি ত্রুটিটি পেয়েছিলাম।

মডেল ক্লাস তৈরির পরে আমার কেবল প্রকল্পটি তৈরি করা দরকার ছিল এবং [কী] টিকাটি ব্যবহার করার দরকার নেই।


2
হ্যাঁ - 'এরপরে, প্রকল্পটি তৈরি করুন। ওয়েব এপিআই স্ক্যাফোর্ডিং মডেল ক্লাসগুলি সন্ধান করতে প্রতিবিম্ব ব্যবহার করে, সুতরাং এটি সংকলিত সমাবেশ প্রয়োজন। এই পৃষ্ঠা
আদম

যথাযথভাবে। কেবল "বিল্ড" কাজ করে, এবং অন্যান্য পূর্ববর্তী উত্তরগুলির কোনওটিই করে না! আমি বেশ কয়েকটি উপায়ে চেষ্টা করেছি এবং শেষ পর্যন্ত আমি এটি তৈরি করেছি এবং এটি কার্যকর হয়েছে! তারপরে আমি এখানে এসে এই উত্তরটি পেয়েছি, যা সঠিক উত্তর।
উইলিয়াম হাউ

মহান। এটি আমার ক্ষেত্রে ছিল, বিল্ড করার পরে সমস্ত সমস্যার সমাধান হয়ে যায়
আলহপ

হ্যাঁ .... ধন্যবাদ .... আশ্চর্যজনক এটি একটি নতুন আপডেট হওয়া ভিএস2019-র একটি সমস্যা: ডি
জানবারুপ

11

[কী] ব্যবহার করা আমার পক্ষে কাজ করে না তবে একটি আইডি সম্পত্তি ব্যবহার করে এটি কার্যকর হয়। আমি এই সম্পত্তিটি আমার ক্লাসে যুক্ত করছি।

public int id {get; set;}

1
এটি হওয়া দরকার [Key], তবে " id" নামে পরিচিত একটি সম্পত্তিও কাজ করবে।
মাইকেল ব্ল্যাকবার্ন

পাবলিক ইন আইডি {পেতে; সেট; } বা [কী] ^ পাবলিক ইন আইডি 1 {পান; সেট; }
লাভা

6

অবজেক্টটিতে অবশ্যই এমন একটি ক্ষেত্র থাকতে হবে যা Primary Keyআপনার নামে যদি একটি ক্ষেত্র থাকে Idতবে এটি ডিফল্টরূপে সেই অবজেক্টের প্রাথমিক কী হবে যার সাথে সত্তা ফ্রেমওয়ার্ক লিঙ্ক করবে।

অন্যথায়, আপনি [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


ধন্যবাদ! আমাদের ইউনিট টেস্ট প্রজেক্টে সিস্টেম যোগ করুন মডেল.অনোটেশন নিউজ প্যাকেজটি আমার জন্য এই ত্রুটিটি স্থির করে। আমি ডিবিমিগ্রেটার আপডেটটি কল করছিলাম এবং এটি আমাদের মডেল এবং DbContext সহ ডোমেন প্রকল্পের নুগেট রেফারেন্স থাকা সত্ত্বেও এটি ব্যর্থ হয়েছিল। উভয় প্রকল্পের এটি প্রয়োজন।
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ডিফল্টরূপে প্রাথমিক কী হিসাবে গ্রহণ করবে ।


যদি ডাটাবেসের আইডিতে একাধিক ক্ষেত্রের প্রত্যয় থাকে তবে কী হবে? পুনর্জন্মের সময় আমি মূল বৈশিষ্ট্যটি হারাব।
রিচার্ড গ্রিফিথস

আপনি যদি ডিবি থেকে কোড তৈরি করে থাকেন, সারণীর একটি কলামের মধ্যে সারণীর প্রাথমিক কী হওয়া উচিত be
মাইকেল ব্ল্যাকবার্ন

উত্পন্ন কোড সম্পর্কিত "সম্পাদনা" সম্পর্কিত, এটি প্রায়শই সর্বদা 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; }
}
        }
    }

উচ্চ শ্রেণীর মোছার পরে এটি আমার পক্ষে ভাল কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.