কোনও অ্যাসোসিয়েটের মূল পরিণতি মানে 1: 1 সত্তার কাঠামোর সাথে সম্পর্ক relationship


269
public class Foo
{
    public string FooId{get;set;}
    public Boo Boo{get;set;}
}


public class Boo
{
    public string BooId{get;set;}
    public Foo Foo{get;set;}
}

আমি ত্রুটি পেলে সত্তা ফ্রেমওয়ার্কে এটি করার চেষ্টা করছিলাম:

'কনসোল অ্যাপ্লিকেশন 5.বু' এবং 'কনসোল অ্যাপ্লিকেশন 5.ফু' প্রকারের মধ্যে সংঘের মূল প্রান্ত নির্ধারণ করতে অক্ষম। এই অ্যাসোসিয়েশনের মূল প্রান্তটি অবশ্যই সম্পর্কের সাবলীল এপিআই বা ডেটা টীকাগুলি ব্যবহার করে স্পষ্টভাবে কনফিগার করা উচিত।

আমি এই ত্রুটির সমাধানের সাথে স্ট্যাকওভারফ্লোতে প্রশ্নগুলি দেখেছি, তবে আমি "মূল প্রবন্ধ" শব্দটির অর্থ কী তা বুঝতে চাই।


উত্তর:


378

এক-থেকে-এক সম্পর্কের ক্ষেত্রে এক প্রান্তটি অবশ্যই মূল এবং দ্বিতীয় প্রান্তটি নির্ভরশীল হতে হবে। প্রিন্সিপাল এন্ডটি হ'ল যা প্রথমে .োকানো হবে এবং কোনটি নির্ভর করে ছাড়াই থাকতে পারে। নির্ভরশীল প্রান্তটি প্রিন্সিপালের পরে অবশ্যই প্রবেশ করানো উচিত কারণ এতে অধ্যক্ষের কাছে বিদেশী কী রয়েছে।

নির্ভরশীল সত্তা কাঠামোর ক্ষেত্রে এফকে অবশ্যই এর পিকে হতে হবে তাই আপনার ক্ষেত্রে ব্যবহার করা উচিত:

public class Boo
{
    [Key, ForeignKey("Foo")]
    public string BooId{get;set;}
    public Foo Foo{get;set;}
}

বা সাবলীল ম্যাপিং

modelBuilder.Entity<Foo>()
            .HasOptional(f => f.Boo)
            .WithRequired(s => s.Foo);

6
@ লাডিস্লাভ, আমার দুটি স্বতন্ত্র টেবিল তৈরি করা দরকার যা উভয়েরই একে অপরের কাছে বিকল্প reference আমি একটি পৃথক প্রশ্ন পোস্ট ।
শিমি ওয়েইজহ্যান্ডলারের

10
এর কোনও উত্তর পেতে আপনার কত ঘন্টা লেগেছিল তা আপনি জানেন না - এমএস ডকুমেন্টেশনটি হ'ল পিইউওওপি টাই।
গ্যাঙ্গেলো

1
নোট করুন আপনাকে সিস্টেম.কম্পোনমেন্টমডেল.ডাটাঅ্যানোটেশন.সচেমা ব্যবহার করে যুক্ত করতে হতে পারে; থেকে পেতে ForeignKey VS2012 মধ্যে
stuartdotnet

2
তার মানে কি Fooতখন সেই অধ্যক্ষ?
bflemi3

8
@ bflemi3 আপনি সঠিক Booতা নির্ভরশীল, একটি প্রয়োজন Fooএবং বিদেশী কী পান। Fooঅধ্যক্ষ এবং একটি ছাড়া বিদ্যমান থাকতে পারে Boo
কলিন

182

এটি সমাধানের জন্য আপনি [Required]ডেটা টীকা বিশিষ্টতাও ব্যবহার করতে পারেন :

public class Foo
{
    public string FooId { get; set; }

    public Boo Boo { get; set; }
}

public class Boo
{
    public string BooId { get; set; }

    [Required]
    public Foo Foo {get; set; }
}

Fooজন্য প্রয়োজন Boo


এটি আমার নিম্নলিখিত কোডের জন্য সঠিক ছিল যেখানে আমি পৃথক সত্তা পাবলিক ক্লাস অর্গানাইজেশন {পাবলিক আইটি আইডি {পেতে দুটিয়ের মধ্যে একটি মানচিত্র চেয়েছিলাম; সেট; ;} পাবলিক ক্লাস ব্যবহারকারী {পাবলিক আইটি আইডি {পান; সেট; ;} সার্বজনীন শ্রেণীর ব্যবহারকারীগোষ্ঠী {[কী] সর্বজনীন আইডি {পান; সেট; } [প্রয়োজনীয়] পাবলিক ভার্চুয়াল অর্গানাইজেশন অর্গানাইজেশন {পেতে; সেট; } [প্রয়োজনীয়] পাবলিক ভার্চুয়াল ব্যবহারকারী ব্যবহারকারী User পান; সেট; }}
অ্যান্ডি

আমি ওরাকল ব্যবহার করছি এবং সাবলীল এপিআইয়ের কোনওটিই আমার পক্ষে কাজ করেনি। ধন্যবাদ ভাই. খুবই সোজা.
ক্যামেরনপি

11
সচেতন হন যে এই সমাধানটি ব্যবহার করার সময় আপনি বৈধতা ব্যতিক্রম পাবেন যখন Booআপনি প্রথমে Fooসম্পত্তিটির অলস-লোড ট্রিগার না করে আপনি কেবলমাত্র ডাটাবেস থেকে পুনরুদ্ধার করার চেষ্টা করেছেন এবং আপডেট করবেন । অ্যান্টিফ্রেমওয়ার্ক.কোড্লেক্স
সোর্স

2
Boo Booভার্চুয়াল না হওয়া উচিত ?
সাইমন_উইভার

1
@ নাথানএলডেনসঃ লিঙ্কটি এখন খারাপ, আপনি কীভাবে এই পরিবর্তনটি করবেন?
ক্যামহার্ট

9

এটি এক-এক সম্পর্ককে কনফিগার করার জন্য সাবলীল এপি ব্যবহার করার বিষয়ে @ লাডিস্লাভ মির্নকের জবাবের প্রসঙ্গে।

এমন পরিস্থিতি FK of dependent must be it's PKছিল যেখানে থাকা সম্ভব ছিল না।

উদাহরণস্বরূপ, Fooইতিমধ্যে এর সাথে একের সাথে একাধিক সম্পর্ক রয়েছে Bar

public class Foo {
   public Guid FooId;
   public virtual ICollection<> Bars; 
}
public class Bar {
   //PK
   public Guid BarId;
   //FK to Foo
   public Guid FooId;
   public virtual Foo Foo;
}

এখন, আমাদের ফু এবং বারের মধ্যে আরও একটি ওয়ান-টু ওয়ান সম্পর্ক যুক্ত করতে হয়েছিল।

public class Foo {
   public Guid FooId;
   public Guid PrimaryBarId;// needs to be removed(from entity),as we specify it in fluent api
   public virtual Bar PrimaryBar;
   public virtual ICollection<> Bars;
}
public class Bar {
   public Guid BarId;
   public Guid FooId;
   public virtual Foo PrimaryBarOfFoo;
   public virtual Foo Foo;
}

সাবলীল এপিআই ব্যবহার করে কীভাবে একের সাথে সম্পর্ক নির্দিষ্ট করা যায় তা এখানে:

modelBuilder.Entity<Bar>()
            .HasOptional(p => p.PrimaryBarOfFoo)
            .WithOptionalPrincipal(o => o.PrimaryBar)
            .Map(x => x.MapKey("PrimaryBarId"));

নোট করুন যে যোগ PrimaryBarIdকরার সময় অপসারণ করা দরকার, যেমন আমরা এটি সাবলীল এপিআই-র মাধ্যমে উল্লেখ করছি।

এছাড়াও নোট করুন যে পদ্ধতির নামটি [WithOptionalPrincipal()][1]এক ধরণের বিড়ম্বনার। এই ক্ষেত্রে, অধ্যক্ষ হলেন বার। এমএসডিএন-র সাথে ওপশনাল ডিপেন্ডেন্ট () বর্ণনা এটি আরও স্পষ্ট করে তোলে।


2
কি হবে যদি আপনি আসলে চানPrimaryBarId সম্পত্তি? এটি আমার কাছে হাস্যকর। যদি আমি সম্পত্তিটি যুক্ত করে বলি এবং এটি বিদেশী কী, তবে আমি একটি ত্রুটি পাই। তবে আমার যদি সম্পত্তি না থাকে তবে EF যাইহোক এটি তৈরি করবে। পার্থক্য কি?
ক্রিস প্র্যাট

1
@ ক্রিস্পার্ট এটি যুক্তিযুক্ত মনে হতে পারে না। ট্রেল এবং ত্রুটির পরে আমি এই সমাধানগুলিতে পৌঁছেছি। আমার সত্তায় PrimayBarIdসম্পত্তি থাকার পরে ওয়ান-টু ওয়ান ম্যাপিং কনফিগার করতে সক্ষম ছিল না Foo। সম্ভবত আপনি একই সমাধানটি চেষ্টা করেছেন। EF সীমাবদ্ধতা সম্ভবত?
সুদর্শন_এমডি

3
ঠিক এটাই. আমি জানতে পেরেছি যে আজ পর্যন্ত EF কখনই অনন্য সূচী প্রয়োগ করে নি। ফলস্বরূপ, একের সাথে মানচিত্রের একমাত্র উপায় হ'ল মূল প্রান্তের প্রাথমিক কীটি নির্ভর প্রান্তের প্রাথমিক কী হিসাবে ব্যবহার করা, কারণ একটি প্রাথমিক কী প্রকৃতির দ্বারা স্বতন্ত্র। অন্য কথায়, তারা এটি অর্ধ-প্রয়োগ করেছে এবং একটি শর্টকাট নিয়েছে যা নির্দেশ করে যে আপনার টেবিলগুলি একটি মানহীন উপায়ে ডিজাইন করতে হবে।
ক্রিস প্র্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.