मेरे पास तीन टेबल हैं:

tbl.विशेषता:

int Id  
int AttributeName  

tbl.उत्पाद:

public int Id
public string  

tbl.ProductAttribute:

int ProductId  
int AttributeId  
string Value  

जब मैं संयोग से tbl.ProductAttribute 2 विदेशी कुंजियों के लिए समान मान के साथ सम्मिलित करता हूं, तो यह एक अपवाद फेंकता है:

मेरी छवि

मैंने अभी-अभी tbl.ProductAttribute में एक नया कॉलम डालकर इसे हल करने का एक तरीका सोचा है

int ProductAttributeId  

फिर इसे प्राथमिक कुंजी के रूप में सेट करें और ProductId, AttributeId विदेशी कुंजी के रूप में उपयोग करें। लेकिन क्या यह इसका समाधान करने का एक तरीका है? यदि ऐसा है, तो कोड को बदले बिना इसे हल करने का कोई बेहतर तरीका है?

0
Mewo 23 अगस्त 2018, 18:18
कृपया हमेशा जानकारी को टेक्स्ट के रूप में जोड़ने का प्रयास करें, छवियों के रूप में नहीं। यह उत्तरदाताओं के लिए उत्तर में इसके कुछ हिस्सों को कॉपी/पेस्ट करना आसान बनाता है। साथ ही, अधिकांश प्रश्नों का उत्तर उस कोड को देखे बिना नहीं दिया जा सकता है जो समस्या को जन्म देता है।
 – 
Gert Arnold
23 अगस्त 2018, 21:45

2 जवाब

आपकी ProductAttribute तालिका कई-से-अनेक सम्मिलित तालिका है जहां ProductId और AttributeId उस तालिका की समग्र प्राथमिक कुंजी हैं। तो ProductId और AttributeId का सेट अद्वितीय होना चाहिए क्योंकि प्राथमिक कुंजी डुप्लिकेट नहीं हो सकती। यदि आप ProductId और AttributeId के सेट के लिए डुप्लिकेट मान सम्मिलित करना चाहते हैं तो आपका ProductAttribute मॉडल वर्ग इस प्रकार होना चाहिए:

public class ProductAttribute 
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public long ProductAttributeId { get; set;}

   public int ProductId  { get; set;}

   public int AttributeId  { get; set;}

   public string Value  { get; set;}
}

इसके अलावा, यदि आप चाहते हैं कि ProductId,AttributeId का सेट डुप्लिकेट हो सकता है लेकिन ProductId,AttributeId और Value का सेट अद्वितीय होना चाहिए तो आपका ProductAttribute मॉडल वर्ग इस प्रकार होना चाहिए:

public class ProductAttribute 
{
    [Key, Column(Order = 0)]
    public int ProductId  { get; set;}

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

    [Key, Column(Order = 2)]
    public string Value  { get; set;}
}
1
TanvirArjel 23 अगस्त 2018, 18:53

प्राथमिक कुंजी को तालिकाओं की पंक्तियों के लिए एक विशिष्ट पहचानकर्ता होना चाहिए। यदि आपके पास अपनी साझा कुंजी के डुप्लीकेट हैं तो यह प्राथमिक कुंजी नहीं हो सकती है। पंक्ति पहचान के लिए बस एक और कॉलम जोड़ें और इसे बढ़ाएं (या अपनी आवश्यकताओं के आधार पर गाइड उत्पन्न करें)। जॉइन करते समय प्रदर्शन में सहायता के लिए आप विदेशी कुंजी के लिए गैर-अद्वितीय अनुक्रमणिका बना सकते हैं।

0
Sean T 23 अगस्त 2018, 18:26