2016-02-26 6 views
5

निर्धारित करने में असमर्थ कारण है, मुझे पता है कि Unable to determine the principal end of an association between the types त्रुटि के बारे में बहुत सी पोस्ट हैं लेकिन मुझे लगता है कि कोई भी व्यक्ति मेरी समस्या से मेल नहीं खाता है, अगर मैं इसके बारे में एक खेद है।मॉडल के लिए दूसरा आत्म रेफरेंसिंग एफके जोड़ने में असमर्थ, कारण अंतिम अंत त्रुटि

मैंने एक ऐसी संस्था बनाई है जो इसे स्वयं के संदर्भ में दो बार संदर्भित करेगी और जब मैं कोड को पहले आत्म संदर्भ के लिए डालता हूं तो यह ठीक काम करता है, जैसे ही दूसरे कोड को तोड़ता है। कुछ परीक्षण करने से मुझे पता चला है कि यदि मैं उनके द्वारा स्वयं के संदर्भों में से किसी एक का उपयोग करता हूं तो स्वयं सब कुछ ठीक काम करता है, यह केवल तब होता है जब मैं दूसरा आत्म संदर्भ जोड़ता हूं जो टूट जाता है। कोड आत्म संदर्भ के लिए मैं उपयोग कर रहा हूँ है:

[ForeignKey("ManagerID")] 
    public User Manager { get; set; } 

    //Auditing Fields 
    public DateTime DateCreated { get; set; } 
    public int? UpdatedByUserID { get; set; } 
    public DateTime? DateUpdated { get; set; } 
    public DateTime LastAutoUpdate { get; set; } 

    [ForeignKey("UpdatedByUserID")] 
    public User UpdatedByUser { get; set; } 

पूर्ण इकाई कोड खंड है:

public class User 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public int ADPFileNumber { get; set; } 

    [Required] 
    public string ADUserName { get; set; } 

    public int AirCardCheckInLateCount { get; set; } 

    [Required] 
    public string Email { get; set; } 

    public DateTime? EndDate { get; set; } 

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

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

    public int ManagerID { get; set; } 
    public string MobilePhone { get; set; } 

    [Required] 
    public string Office { get; set; } 

    [Required] 
    public string Phone { get; set; } 

    public decimal PTO { get; set; } 
    public DateTime StartDate { get; set; } 
    public int VehicleCheckInLateCount { get; set; } 
    public int WexCardDriverID { get; set; } 

    [ForeignKey("ManagerID")] 
    public User Manager { get; set; } 

    //Auditing Fields 
    public DateTime DateCreated { get; set; } 
    public int? UpdatedByUserID { get; set; } 
    public DateTime? DateUpdated { get; set; } 
    public DateTime LastAutoUpdate { get; set; } 

    [ForeignKey("UpdatedByUserID")] 
    public User UpdatedByUser { get; set; } 
} 

मैं क्या याद आ रही है, जिनके कारण दूसरे आत्म संदर्भ तोड़ने के लिए?

उत्तर

2

आप स्पष्ट रूप से दोनों संघों के प्रमुख समाप्ति दर्शाने के लिए है जोड़ना चाहिए। तुम्हें पता है, उस वर्ग के साथ आप मूल रूप से किया था कर सकते हैं बिना उलटा संग्रह गुण:

modelBuilder.Entity<User>() 
      .HasOptional(u => u.Manager) 
      .WithMany() 
      .HasForeignKey(u => u.ManagerID); 
modelBuilder.Entity<User>() 
      .HasOptional(u => u.UpdatedByUser) 
      .WithMany() 
      .HasForeignKey(u => u.UpdatedByUserID); 

ध्यान दें कि ManagerID एक int? रूप में अच्छी तरह होना चाहिए। आप किसी भी User नहीं बना सकते हैं अगर इसे किसी अन्य उपयोगकर्ता को पिक्सेलिस्ट की आवश्यकता होती है। यह एक चिकन-अंडे की समस्या है।

+0

के लिए नहीं, ऐसा लगता है कि नामुमकिन प्रकार पर काम किया गया है और अच्छी पकड़ है, मेरे हिस्से पर एक प्रकार का ओ था। प्रश्न हालांकि, क्या यह करने का यही एकमात्र तरीका है? मैं कक्षा में पूरी इकाई परिभाषा के बजाय और विभाजित नहीं होगा। – Matthew

+0

आप * लुई द्वारा प्रस्तावित दो व्यस्त संग्रह गुणों का उपयोग कर सकते हैं (लेकिन '[इनवर्क्सप्रोपर्टी]' विशेषता का भी उपयोग कर सकते हैं)। इनके बिना (जो आप पसंद करते हैं), एकमात्र तरीका धाराप्रवाह मैपिंग का उपयोग करना है। –

0

जैसा कि Multiple self-referencing relationships in Entity Framework में उल्लेख किया गया है, आप रिश्ते के दूसरे हिस्से को याद कर रहे हैं।

अर्थात

[InverseProperty("Manager")] 
public virtual ICollection<User> ManagedUsers {get;set;} 
[InverseProperty("UpdatedByUser")] 
public virtual ICollection<User> UpdatedUsers {get;set;} 

संपादित करें: @Gert अर्नोल्ड के उत्तर के आधार पर आप वास्तव में [InverseProperty] विशेषता

+0

आपके लिंक किए गए प्रश्न और आपके उत्तर के आधार पर मैंने अपना कोड अपडेट किया, और जब कोड अब बनाता है तो यह दूसरी कुंजी नहीं बना रहा है। यह प्रबंधक आईडी के लिए एफके बनाता है लेकिन अपडेटेडब्यूयूसर आईडी – Matthew

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