2012-07-20 12 views
5

मैं एक-से-अनेक संबंध के लिए निम्नलिखित वर्गों का उपयोग कर रहा के साथ पहली बार कोड का उपयोग कर एफई:एक-से-कई संबंध बनाने डुप्लिकेट विदेशी कुंजी

public class Supplier 
{ 
    public Supplier() 
    { 
     SupplierId = Guid.NewGuid(); 
    } 

    public Guid SupplierId { get; set; } 
    [Required] 
    public string Name { get; set; } 

    [Required] 
    public virtual Address Address { get; set; } 

    public virtual ICollection<Contact> Contacts { get; set; } 
} 

public class Contact 
{ 
    public Contact() 
    { 
     ContactId = Guid.NewGuid(); 
    } 

    public Guid ContactId { get; set; } 

    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 

    [Required] 
    public Guid SupplierId { get; set; } 
    [ForeignKey("SupplierId")] 
    public virtual Supplier Supplier { get; set; } 
} 

मैं ASP.NET MVC 4 का उपयोग कर रहा और पर एक नया संपर्क का बनाएँ, SupplierId क्वेरी स्ट्रिंग में पारित कर दिया और एक छिपी हुई फ़ील्ड के रूप में रूप बनाने संपर्क में जोड़ा जाता है:

@Html.HiddenFor(model => model.SupplierId) 

यह संपर्क सफलतापूर्वक बनाता है और पॉप्युलेट संपर्क के SupplierId क्षेत्र से Guid साथ है क्वेरी स्ट्रिंग। हालांकि, समस्या यह है कि संपर्क तालिका में वर्चुअल प्रदायक संबंध के लिए एक और फ़ील्ड है जिसे Supplier_SupplierId कहा जाता है और यह फ़ील्ड न्यूल है। मुझे यकीन नहीं है कि मैं समझता हूं कि क्यों सप्लायर_SupplierId संपर्क तालिका पर भी बनाया जा रहा है, क्योंकि प्रदायक ID को विदेशी कुंजी के रूप में उपयोग किया जाना चाहिए और यह केवल अनावश्यक होगा। यदि मैं प्रदायक के संपर्क संग्रह तक पहुंचने का प्रयास करता हूं तो मैंने सफलतापूर्वक एक संपर्क जोड़ा, संग्रह वापस खाली आता है क्योंकि Contact.Supplier_SupplierId पूर्ण है। हालांकि, अगर मैं सप्लायर आईडी कॉलम से वैल्यू को कॉपी रिकॉर्ड के सप्लायर_SupplierId कॉलम में कॉपी करता हूं, तो प्रदायक। संपर्क संपर्क वापस लाएगा।

यह वही है जो मेरे संपर्क तालिका समाप्त होता है की तरह लग रही है:

CREATE TABLE [dbo].[Contacts] (
    [ContactId]   UNIQUEIDENTIFIER NOT NULL, 
    [FirstName]   NVARCHAR (MAX) NOT NULL, 
    [LastName]   NVARCHAR (MAX) NOT NULL, 
    [Supplier_SupplierId] UNIQUEIDENTIFIER NULL, 
    CONSTRAINT [PK_dbo.Contacts] PRIMARY KEY CLUSTERED ([ContactId] ASC), 
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_SupplierId] FOREIGN KEY ([SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]), 
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_Supplier_SupplierId] FOREIGN KEY ([Supplier_SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]) 
); 

क्यों आपूर्तिकर्ता को 2 विदेशी कुंजी संपर्क में बनाए जा रहे हैं किसी को भी पता है? मैं इसे कैसे बदल सकता हूं ताकि आपूर्तिकर्ताओं के लिए एकमात्र विदेशी कुंजी प्रदायक है?

+0

क्या आपके पास फ्लुएंट एपीआई के साथ कोई मैपिंग है? क्या आपने कुछ सम्मेलनों को हटा दिया? क्या आप कक्षाएं पूर्ण दिख रहे हैं या 'प्रदायक' और 'संपर्क' के बीच और अधिक नेविगेशन गुण हैं? modelBuilder.Entity () .HasRequired (r => r.Supplier) .WithMany() .HasForeignKey (च => च: – Slauma

+1

मैं एकाधिक झरना रास्तों त्रुटि को ठीक करने में OnModelCreating समारोह अधिभावी कर रहा हूँ। प्रदायक ID) .WillCascadeOnDelete (झूठा); मैंने कुछ साधारण गुण हटा दिए जो कक्षाओं से इस मुद्दे पर लागू नहीं होते हैं, लेकिन कक्षाओं के बीच कोई संदर्भ नहीं है। प्रदायक से संपर्कों में केवल एक-एक-एक है। –

उत्तर

6

यह मानचित्रण गलत (मैं आपके सवाल का नीचे अपनी टिप्पणी के लिए बात कर रहा हूँ) है:

modelBuilder.Entity<Contact>() 
    .HasRequired(r => r.Supplier) 
    .WithMany() 
    .HasForeignKey(f => f.SupplierId) 
    .WillCascadeOnDelete(false); 

आप की जरूरत है:

modelBuilder.Entity<Contact>() 
    .HasRequired(r => r.Supplier) 
    .WithMany(s => s.Contacts) 
    .HasForeignKey(f => f.SupplierId) 
    .WillCascadeOnDelete(false); 

अन्यथा एफई एक नेविगेशन संपत्ति के अंतर्गत आता है कि के रूप में Supplier.Contacts पर विचार करेगी Supplier और Contact के बीच एक और दूसरा एक-दूसरे के रिश्ते - और यह दूसरी विदेशी कुंजी पेश करता है।

+0

धन्यवाद! वह अपराधी था। –

+0

आपने बिल्कुल वही गलती की है जो मैंने बनाई है। धन्यवाद! –

संबंधित मुद्दे