2012-02-10 18 views
5

मुझे वर्तमान में EF4.1 के साथ कुछ समस्याएं हैं। एसक्यूएल की पीढ़ी मेरी कक्षाओं के आधार पर जेनरेट होने की उम्मीद से मेल नहीं खाती है। मैं निम्नलिखित वर्गों (यह सिर्फ एक बड़ा संग्रह का एक छोटा समूह है, हालांकि, इस जगह है जहाँ मैं मुद्दों कर प्रतीत) ... हैइकाई फ्रेमवर्क 4.1 भूत कॉलम

public class CustomEntityContext : DbContext 
{ 
    public CustomEntityContext() 
      :base(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString) {} 

    public DbSet<Person> People { get; set; } 
    public DbSet<Occurrence> Occurrences { get; set; } 
    public DbSet<OccurrenceSecurity> OccurrenceSecurities { get; set; } 
} 


[DataContract(IsReference = true)] 
[Table("Occurrence")] 
public class Occurrence 
{ 
    [DataMember] public int ID { get; set; } 
    [DataMember] public string Number { get; set; } 
    [DataMember] public bool? IsMOR { get; set; } 
    [DataMember] public bool? IsConfidential { get; set; } 
    [DataMember] public int? IncidentID { get; set; } 
    [DataMember] public bool? CanPublish { get; set; } 
    [DataMember] public bool? IsFeedbackRequired { get; set; } 
    [DataMember] public bool? IsRegulatorReport { get; set; } 
    [DataMember] public DateTime? RecordedDate { get; set; } 
    [DataMember] public DateTime? ReportedDate { get; set; } 
    [DataMember] public int? ReportTypeID { get; set; } 
    [DataMember] public bool? IsMain { get; set; } 
    [DataMember] public bool? IsRejected { get; set; } 
    [DataMember] public string Title { get; set; } 
    [DataMember] public byte[] Version { get; set; } 
    [DataMember] public string ReportDataXml { get; set; } 
    [DataMember] public int? LocationID { get; set; } 
    [DataMember, ForeignKey("RecordedByPersonID")] public Person Recorder { get; set; } 
    [DataMember, ForeignKey("ReportedByPersonID")] public Person Reporter { get; set; } 
} 

[DataContract(IsReference = true)] 
[Table("OccurrenceSecurity")] 
public class OccurrenceSecurity 
{ 
    [DataMember, Key, Column("PersonID", Order = 0)] public int PersonID { get; set; } 
    [DataMember, ForeignKey("PersonID")] public Person Person { get; set; } 
    [DataMember, Key, Column("OccurrenceID", Order = 1)] public int OccurrenceID { get; set;   
    [DataMember, ForeignKey("OccurrenceID")] public Occurrence Occurrence { get; set; } 
} 

[DataContract(IsReference = true)] 
[Table("Person")] 
public class Person 
{ 
    [DataMember] public int ID { get; set; } 
    [DataMember] public string FullName { get; set; } 
    //[DataMember] public Occurrence[] RecordedOccurrences { get; set; } 
    //[DataMember] public Occurrence[] ReportedOccurrences { get; set; } 
    //[DataMember] public OccurrenceSecurity[] OccurrenceSecurities { set; get; } 
} 

जब मैं OccurrenceSecurities के लिए पूछना, शामिल तरीकों के साथ , मैं घटना और व्यक्ति दोनों को शामिल करने के लिए कहता हूं। बाद में, एसक्यूएल उत्पन्न होता है कि इस प्रकार है ...

SELECT 
[Extent1].[PersonID] AS [PersonID], 
[Extent1].[OccurrenceID] AS [OccurrenceID], 
[Extent2].[ID] AS [ID], 
[Extent2].[FullName] AS [FullName], 
[Extent3].[ID] AS [ID1], 
[Extent3].[Number] AS [Number], 
[Extent3].[IsMOR] AS [IsMOR], 
[Extent3].[IsConfidential] AS [IsConfidential], 
[Extent3].[IncidentID] AS [IncidentID], 
[Extent3].[CanPublish] AS [CanPublish], 
[Extent3].[IsFeedbackRequired] AS [IsFeedbackRequired], 
[Extent3].[IsRegulatorReport] AS [IsRegulatorReport], 
[Extent3].[RecordedByPersonID] AS [RecordedByPersonID], 
[Extent3].[RecordedDate] AS [RecordedDate], 
[Extent3].[ReportedByPersonID] AS [ReportedByPersonID], 
[Extent3].[ReportedDate] AS [ReportedDate], 
[Extent3].[ReportTypeID] AS [ReportTypeID], 
[Extent3].[IsMain] AS [IsMain], 
[Extent3].[IsRejected] AS [IsRejected], 
[Extent3].[Title] AS [Title], 
[Extent3].[Version] AS [Version], 
[Extent3].[ReportDataXml] AS [ReportDataXml], 
[Extent3].[LocationID] AS [LocationID], 
[Extent3].[Person_ID] AS [Person_ID],    -- Where does this come from? 
[Extent3].[Person_ID1] AS [Person_ID1]    -- Where does this come from? 
FROM [dbo].[OccurrenceSecurity] AS [Extent1] 
INNER JOIN [dbo].[Person] AS [Extent2] ON [Extent1].[PersonID] = [Extent2].[ID] 
LEFT OUTER JOIN [dbo].[Occurrence] AS [Extent3] ON [Extent1].[OccurrenceID] = [Extent3].[ID] 

जैसा कि आप देख सकते हैं, वहाँ ब्लॉक का चयन करें जो Person_ID और Person_ID1 चयन कर रहे हैं के अंत में 2 कॉलम हैं। ये मेरी अंतर्निहित तालिका में, या मेरी वस्तु में मौजूद नहीं है।

क्या कोई जानता है कि ये कहां से आए हैं और वे वहां क्यों हैं?

इसके अलावा, मुझे पता है कि यह एक बहुत से रिश्ते हैं, हालांकि, ऑकुरेंस सिक्योरिटीज टेबल/क्लास अधिक डेटा रखने के लिए विस्तारित होगी।

धन्यवाद, डेविड

+0

मैंने डीबीकॉन्टेक्स्ट क्लास पर ऑनमोडेल क्रिएटिंग विधि का उपयोग करके मॉडल को कॉन्फ़िगर करने का प्रयास किया है। मैंने इकाइयों पर प्रत्येक विशेषता से कॉन्फ़िगरेशन की प्रतिलिपि बनाई, उन से गुण हटा दिए और SQL क्वेरी अब उन 2 अतिरिक्त कॉलम के बिना उत्पन्न हुई है –

उत्तर

2
शामिल तरीकों के साथ

, मैं दोनों घटना और व्यक्ति शामिल करने के लिए पूछना

ये अतिरिक्त कॉलम एफई द्वारा उपयोग किया जाएगा क्वेरी से वस्तु ग्राफ के निर्माण के लिए परिणाम है। Include का उपयोग करके, आप कह रहे हैं "मैं केवल एक स्टोर कमांड निष्पादित करना चाहता हूं, लेकिन मैं कई ऑब्जेक्ट्स पुनर्प्राप्त करना चाहता हूं"। बल्कि कई resultsets का उपयोग कर (जो नहीं सभी समर्थन भंडार का समर्थन करेंगे) की तुलना में, एफई के बजाय, इस तरह के परिणामों के साथ कोई क्वेरी भेजता है जब आप A.Include("B.C") क्वेरी:

columns for A1 columns for B1 columns for C1 
columns for A1 columns for B1 columns for C2 
columns for A1 columns for B1 columns for C3 
columns for A1 columns for B2 columns for C4 
columns for A1 columns for B2 columns for C5 
columns for A2 columns for B3 columns for C6 
columns for A2 columns for B3 columns for C7 

और फिर एक साथ इन पंक्तियों सिलाई दो A, 3 B बनाने के लिए एस और 7 C एस, उचित संबंधों के साथ।

आपके द्वारा दिखाए जाने वाले विशेष अतिरिक्त कॉलम का उपयोग सिलाई-एक साथ प्रक्रिया में ईएफ द्वारा किया जाता है, मेरा अनुमान है।

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