2012-02-10 92 views
5

我目前有EF4.1的一些问题。 SQL的生成似乎不符合我期望基于我的类生成的内容。我有以下类(这只是一组小的大集合,然而,这是我似乎有问题)...实体框架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,与包括如下的方法,我要求包括事件和人员。随后,产生如下的SQL ...

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] 

正如你所看到的,有2列在被选择PERSON_ID和Person_ID1选择块的结束。这些不存在于我的基础表或我的对象中。

有谁知道这些来自哪里,为什么他们在那里?

此外,我知道这是一个多对多关系,但OccurrenceSecurities表/类将扩展以容纳更多数据。

谢谢, 大卫

+0

我刚刚尝试在DbContext类上使用OnModelCreating方法来配置模型。我从实体上的每个属性复制了配置,从中删除了这些属性,现在生成的SQL查询没有这两个额外的列 – 2012-02-10 14:22:28

回答

2

与包括方法,我问既包括发生与人

这些额外的列将通过EF被用来从查询构造对象图结果。通过使用Include,你说“我只想执行一个存储命令,但我想检索许多对象”。而不是使用多个结果(不是所有的后备存储将支持),EF,而不是发出像这样结果的查询,在查询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 s和7 C s,并有适当的关系。

您所展示的特定额外列在EF拼接过程中由EF使用,这是我的猜测。