- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前在使用 EF4.1 时遇到了一些问题。 SQL 的生成似乎与我期望基于我的类生成的内容不匹配。我有以下类(class)(这只是更大集合中的一小部分,但是,这是我似乎遇到问题的地方)...
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; }
}
当我使用 Include 方法请求 OccurrenceSecurities 时,我要求包括 Occurrence 和 Person。随后生成的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]
如您所见,选择 block 末尾有 2 列,分别选择 Person_ID 和 Person_ID1。这些不存在于我的基础表或我的对象中。
有谁知道这些是从哪里来的,为什么会在那里?
此外,我知道这是一个多对多关系,但是,OccurrenceSecurities 表/类将扩展以容纳更多数据。
谢谢,大卫
最佳答案
with the Include methods, I ask to include both the Occurrence and Person
EF 将使用这些额外的列从查询结果构建对象图。通过使用 Include
,您是在说“我只想执行一个 存储命令,但我想检索许多 对象”。当您查询 A.Include("B.C")
时,EF 不会使用多个结果集(并非所有后备存储都支持),而是发出一个包含这样结果的查询:
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
,并具有适当的关系。
我猜,EF 在拼接过程中使用了您显示的特定额外列。
关于c# - Entity Framework 4.1 幽灵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9228333/
我有一个 IDE 断点 (delphi-xe),每次编译和运行程序时它都会重新出现。我该如何摆脱它。 Delphi 在哪里保存有关断点的信息? 更新: 1.断点未在“Breakpoints”面板中列出
(编辑)此问题已解决 - 请参阅答案。 我遇到了一个我以前从未见过的 Java/Swing 和 Netbeans 的不幸问题。我在 Netbeans 中设计了一个基本的纸牌游戏形式,它看起来运行得很好
在我的 iOS 应用程序中,当使用以下方式从 View Controller 2 转换到 1 时: let storyBoard: UIStoryboard = UIStoryboard(name:
我有一个名为 Notebook 的父实体,与 Page 实体具有一对多关系。我有一个 ScrollView ,显示所有笔记本对象及其封面,并且我有一个带有 View Controller 的模式序列,
CIVITASINC - ATLANTIC AVENUE (手机浏览器查看) 所以...当您在 iphone 或 android 上加载上面的页面时,它会使用 Wordpress 插件 Portfol
我目前正在用 Java 制作吃 bean 人游戏。不过我有一个关于鬼魂的问题。 我知道鬼魂的攻击方式并不完全相同。我首先想研究让鬼魂去追吃 bean 的基础知识,而不用担心其中的差异。 我想问你们这些
我在使用 SQL Server 2005 数据库时遇到了一些问题,它似乎一直存在幽灵约束。我有一个脚本可以删除有问题的约束,做一些工作,然后重新添加相同的约束。通常,它工作正常。然而,现在它不能重新添
例如在 map 中: {"test-1" 23, "test-2" 456, "test-3" 23} 如何找到具有值 23 的键? 最佳答案 我认为您不需要幽灵来做到这一点,只需按值过滤即可。
我正在使用Sortable from Rubaxa对 Bootstrap 表中的行进行排序。 表格行的单元格包含 Bootstrap 输入。 现在,行排序正常,但“幽灵”图像仅显示行中的按钮,而不显示
我正在为我的博客开发一个 Ghost 模板。我想在首页上只看到来自带有特定标签(例如“新闻”)的帖子的最新帖子。 是否可以在 foreach 中按标签过滤帖子环形? 还有其他解决办法吗? (首先想到的
我是一名优秀的程序员,十分优秀!