विदेशी कुंजी के रूप में समग्र कुंजी


90

मैं एमवीसी 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; }
} 

लेकिन क्या होगा यदि श्रेणी में दो कॉलम कुंजी हैं?

जवाबों:


168

आप धाराप्रवाह एपीआई का उपयोग कर सकते हैं:

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

क्या मुझे आभासी गुणों (सार्वजनिक आभासी श्रेणी श्रेणी {get; set?}) के साथ-साथ डेटा एनवॉएशन रखने की आवश्यकता है?
डॉटनेटस्पेर

4
virtualआलसी लोडिंग के लिए नेविगेशन गुण आवश्यक है। virtualअदिश गुणों पर संलग्न वस्तुओं के परिवर्तन पर नज़र रखने में मदद करता है।
लादिस्लाव मृंका

4
यदि विदेशी कुंजी तालिका के स्तंभ नाम माता-पिता की तुलना में भिन्न थे, तो आप क्या करेंगे? उदाहरण उदाहरण के लिए, उत्पाद में, यदि आप कॉलम नाम जैसे दिखते हैं तो आप फॉरेनके विशेषता को कैसे लेबल करेंगे: PCategoryId2, PCategoryId3?

इस लाइन के बारे में: .HasRequired(p => p.Category)लेकिन Productइसमें इकाई की संपत्ति नहीं है, Catagoryलेकिन दो आईडी जो एक कैटैगरी की समग्र कुंजी बनाती हैं। क्या आप कृपया समझा सकते हैं, क्योंकि मेरा मानना ​​है कि यह संकलन भी नहीं होगा ... धन्यवाद!
gdoron

@gdoron: Productहै Categoryमेरा उत्तर में।
लादिस्लाव मृंका

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

कुछ मामलों में विदेशी कुंजी वर्तमान तालिका की समग्र कुंजी का भी हिस्सा है। इस तरह काम किया। दूसरा रास्ता (@Ladislov) नहीं था। मुझे त्रुटि मिली: "डुप्लिकेट कॉलम
फ़ीचर

RoLYroLLs: cascadeDelete माइग्रेशन फ़ाइल (ऐड-माइग्रेशन पैकेज मैनेजर कमांड का उपयोग करने के बाद) में सेट किया गया है। एक उदाहरण: AddForeignKey ("dbo.Product", "GuidedActivityID", "dbo.GuidedActivity", "ID", cascadeDelete: false);
क्रिस्टोफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.