2011-03-04 6 views
9

मैं एक साधारण इकाई ढांचा कोड पहले आवेदन बनाने की कोशिश कर रहा हूं। मैं इन कक्षाओं में है:एंटिटी फ्रेमवर्क कोड कैसे प्राप्त करें काम करने के लिए पहले और शून्य से विदेशी कुंजी गुण?

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

public class ActivationTicket 
{ 
    public int ActivationTicketId { get; set; } 

    public virtual User User { get; set; } 

    public string Ticket { get; set; } 
} 

जब मैं एक नया उपयोगकर्ता बनाने और डेटाबेस (एक ActivationTicket है कि बिना किसी उपयोगकर्ता) मैं एक अपवाद

सम्मिलित बयान के साथ विरोध हुआ प्राप्त करने के लिए यह को बचाने की कोशिश विदेशी कुंजी बाधा "सक्रियण टिकट_उसर"। संघर्ष डेटाबेस "टेस्ट", तालिका "dbo.ActivatioTickets", कॉलम 'सक्रियण टिकट ID' में हुआ। बयान समाप्त कर दिया गया है।

मुझे लगता है एफई उपयोगकर्ता और ActivationTicket के बीच मानचित्रण व्यवहार करता है 1-1 के रूप में, लेकिन यह 1-0..1

यह क्या काम करने के लिए मैं पाने के लिए क्या करना होगा होना चाहिए?

 
modelBuilder 
    .Entity<User>() 
    .HasOptional<ActivationTicket>(u => u.ActivationTicket) 
    .WithOptionalPrincipal(); 

यह आपको एक प्रयोक्ता-आईडी है कि व्यर्थ है के साथ एक ActivationTickets तालिका दे देंगे:

उत्तर

20

आप इस प्रकार का मानचित्रण नियम की आवश्यकता होगी।

+0

मैं अभी ईएफ के साथ शुरू कर रहा हूं इसलिए मुझे पूरा यकीन नहीं है कि यह मैपिंग नियम कहां रखा जाए। क्या उन सभी मैपिंग को स्टोर करने के लिए एक अनुशंसित जगह है? – b3n

+2

आपके पास दो विकल्प हैं। 1) इसे सीधे अपनी कक्षा की एक विधि में रखें जो डीबीकॉन्टेक्स्ट से प्राप्त होता है: संरक्षित ओवरराइड शून्य ऑनमोडेल क्रिएटिंग (मॉडलबिल्डर मॉडलबिल्डर) - या - 2) मॉडलबिल्डर का उपयोग करके अलग-अलग वर्गों में मैपिंग को परिभाषित करें। कॉन्फ़िगरेशन। जोड़ें (नया ...) – anon

+1

मैं अलग-अलग वर्गों में मैपिंग को परिभाषित करने की दृढ़ता से अनुशंसा करता हूं (एंटीटी टाइप कॉन्फ़िगरेशन से प्राप्त YourModelClass_MappingClass को परिभाषित करें, और इस वर्ग के सीटीआर में मैपिंग को परिभाषित करें, फिर आपको इसे डीबीकॉन्टेक्स्ट ऑनमोडेल क्रिएटिंग इवेंट में प्रारंभ करना होगा क्योंकि @anon ने अपनी टिप्पणी में लिखा था। अलग-अलग वर्गों का उपयोग करने के लिए क्योंकि यह एक ही जगह पर आपके सभी वर्गों के लिए मानचित्रण को परिभाषित करने के लिए एक वास्तविक गड़बड़ होगी – Prokurors

4

@ B3n यह कम से कम वी.एस. 2013 के साथ ऐसा करने के लिए, पर्याप्त होना चाहिए:

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public int? ActivationTicketId { get; set;} 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

यह महत्वपूर्ण हिस्सा है:

public int? ActivationTicketId { get; set;} 

यह आपका "उपयोगकर्ता में foreignkey निर्दिष्ट करेगा "ActivasionTicket के लिए तालिका और परिभाषित करें कि यह वैकल्पिक है।

क्रेडिट जाने के लिए: http://forums.asp.net/t/1948351.aspx?Change+Foreign+Key+to+nullable+using+Code+First#5554732

मैं एक ही समस्या थी और यह तुरन्त मेरे लिए काम किया।

एक नोट के रूप में मैंने अपनी सभी प्राथमिक कुंजी को डेटा एनोटेशन "[कुंजी]" के साथ चिह्नित किया। यह काम करने के लिए यह आवश्यक हो सकता है।