বিদেশী কী হিসাবে যৌগিক কী


91

আমি এমভিসি 3 অ্যাপ্লিকেশনটিতে সত্ত্বা ফ্রেমওয়ার্ক 4.1 ব্যবহার করছি। আমার একটি সত্তা রয়েছে যেখানে আমার প্রাথমিক কীতে দুটি কলাম (সমন্বিত কী) থাকে। এবং এটি বিদেশী কী হিসাবে অন্য সত্তায় ব্যবহৃত হচ্ছে। কীভাবে সম্পর্ক তৈরি করবেন? সাধারণ স্ক্যানারিওগুলিতে আমরা ব্যবহার করি:

public class Category
{
    public string CategoryId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public string CategoryId { get; set; }

    public virtual Category Category { get; set; }
} 

তবে বিভাগে যদি দুটি কলাম কী থাকে?

উত্তর:


169

আপনি উভয়ই সাবলীল এপিআই ব্যবহার করতে পারেন:

public class Category
{
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }

    public virtual Category Category { get; set; }
}

public class Context : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Category>()
            .HasKey(c => new {c.CategoryId1, c.CategoryId2});

        modelBuilder.Entity<Product>()
            .HasRequired(p => p.Category)
            .WithMany(c => c.Products)
            .HasForeignKey(p => new {p.CategoryId1, p.CategoryId2});

    }
}

বা ডেটা টিকা:

public class Category
{
    [Key, Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [Key, Column(Order = 1)]
    public int CategoryId3 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public string Name { get; set; }
    [ForeignKey("Category"), Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [ForeignKey("Category"), Column(Order = 1)]
    public int CategoryId3 { get; set; }

    public virtual Category Category { get; set; }
}

আমার কী ভার্চুয়াল বৈশিষ্ট্যগুলি (পাবলিক ভার্চুয়াল বিভাগ বিভাগ {পেতে; সেট;}) পাশাপাশি ডেটা এনভোভেশনগুলি রাখা দরকার?
ডটনেটস্প্যারো

4
virtualঅলস লোডিংয়ের জন্য নেভিগেশন বৈশিষ্ট্যগুলি প্রয়োজনীয়। virtualস্কেলারের বৈশিষ্ট্যগুলিতে সংযুক্ত বস্তুর ট্র্যাকিং পরিবর্তন করতে সহায়তা করে।
লাডিস্লাভ মৃণকা

4
বিদেশী কী টেবিলের কলামের নাম পিতামাতার থেকে আলাদা থাকলে আপনি কী করবেন? উদাহরণস্বরূপ, উত্পাদনে, কলামের নামগুলি দেখতে পেলাম: পিসিগ্রাগি আইডি 2, পিসি ক্যাটাগরি আইড 3?

এই লাইন সংক্রান্ত: .HasRequired(p => p.Category)কিন্তু Productএকটি সম্পত্তি নেই সত্তা Catagory কিন্তু দুই আইডি যা catagory এর যৌগিক কী আছে। আপনি দয়া করে ব্যাখ্যা করতে পারেন, কারণ আমি বিশ্বাস করি এটি সংকলনও করবে না ... ধন্যবাদ!
gdoron মনিকা 24 ই

@gdoron: Productহয়েছে Categoryআমার উত্তর হবে।
লাডিস্লাভ Mrnka

25

আমি বিশ্বাস করি সবচেয়ে সহজ উপায় হ'ল নেভিগেশন সম্পত্তিতে ডেটা টীকাগুলি ব্যবহার করা: [ForeignKey("CategoryId1, CategoryId2")]

public class Category
{
    [Key, Column(Order = 0)]
    public int CategoryId1 { get; set; }
    [Key, Column(Order = 1)]
    public int CategoryId2 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }

    [ForeignKey("CategoryId1, CategoryId2")]
    public virtual Category Category { get; set; }
}

এটি দুর্দান্ত কাজ করেছে। আমিও এটি Navigationবৈশিষ্ট্যে ব্যবহার করতে পছন্দ করি । তবে, আমি কীভাবে cascadeDelete: falseকেবল এই সাইটটির জন্য নয়, কেবল এই সম্পত্তিটির জন্য সেট করতে পারি ? ধন্যবাদ
RoLYroLLs

কিছু ক্ষেত্রে বিদেশী কীও বর্তমান সারণীর সংমিশ্রিত কীটির অংশ। এইভাবে কাজ। অন্য উপায় (@ লাডিস্লোভ) তা করেনি। আমি ত্রুটি পেয়েছি: "সদৃশ কলাম বৈশিষ্ট্য"
ডি কেরমট

RoLYroLLs: ক্যাসকেডডিলিটটি মাইগ্রেশন ফাইলে সেট করা আছে (অ্যাড-মাইগ্রেশন প্যাকেজ ম্যানেজার কমান্ড ব্যবহার করার পরে)। একটি উদাহরণ: অ্যাডফোরইনকি ("ডিবিও.প্রডাক্ট", "গাইডডঅ্যাক্টিভিটিআইডি", "ডিবিও.গুইটেডঅ্যাক্টিভিটি", "আইডি", ক্যাসকেড ডিলিট: মিথ্যা);
ক্রিস্টোফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.