C# 实体框架:这些列是从哪里来的?

C# 实体框架:这些列是从哪里来的?,c#,database,entity-framework,C#,Database,Entity Framework,我们试图让实体框架在现有数据库的情况下工作(因此,更改数据库模式不是一个选项),我们创建的单元测试显示了一些非常奇怪的行为 这是它为我们拥有的特定对象吐出的SQL: SELECT [Extent1].[CommentTypeId] AS [CommentTypeId], [Extent1].[DataPartId] AS [DataPartId], [Extent1].[CommentId] AS [CommentId], [Extent1].[CreatedTime] AS [Crea

我们试图让实体框架在现有数据库的情况下工作(因此,更改数据库模式不是一个选项),我们创建的单元测试显示了一些非常奇怪的行为

这是它为我们拥有的特定对象吐出的SQL:

SELECT 
[Extent1].[CommentTypeId] AS [CommentTypeId], 
[Extent1].[DataPartId] AS [DataPartId], 
[Extent1].[CommentId] AS [CommentId], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Message] AS [Message], 
[Extent1].[From] AS [From], 
[Extent1].[Likes] AS [Likes], 
[Extent1].[SourceTypeId] AS [SourceTypeId], 
[Extent1].[StatusMessage_DataPartId] AS [StatusMessage_DataPartId], 
[Extent1].[Album_DataPartId] AS [Album_DataPartId]
FROM [dbo].[Comments] AS [Extent1]
您可能会注意到,请求的最后两列与其他列不同。这是因为它们实际上并不存在,我们不知道实体为什么要请求它们!我们的配置文件和POCO都没有提到它们。事实上,就我们的数据库而言,它们是完全独立的概念,完全没有直接关系

这些专栏是从哪里来的?我该如何告诉它把它删掉

编辑:回答下面的一些问题, 1) 我们使用的是实体框架4.2。我们正在使用fluent映射

2) POCO本身看起来是这样的,为了简洁起见,删除了平等混乱:

public long DataPartId { get; set; }
public string CommentId { get; set; }
public DateTime? CreatedTime { get; set; }
public string Message { get; set; }
public string From { get; set; }
public int? Likes { get; set; }
public string SourceTypeId { get; set; }
public int CommentTypeId { get; set; }

public virtual DataPart DataPart { get; set; }
public virtual CommentType CommentType { get; set; }
3) 我们没有使用edmx。我们有一个自定义的DbContext。没有太多非常有趣的台词。这两个问题可能值得关注:

    Configuration.LazyLoadingEnabled = true;
    Configuration.ProxyCreationEnabled = true;
除此之外,上下文文件还有很多内容

modelBuilder.Configurations.Add(new WhateverConfiguration()) 


在XML编辑器中打开.edmx并搜索这些列。它们一定在你模型的某个地方

编辑:您最初的问题没有提到您正在首先使用代码。我想知道您的数据库第一个问题是什么,它通常工作得很好。使用代码优先或模型优先,通常在创建模型后创建数据库(使用生成的SQL脚本)

您将最后两个属性声明为虚拟属性,这就是生成的SQL看起来不同的原因。从您向我们展示的代码中,我们看不到对唱片集的引用来自何处


因为您有数据库,所以我将在一个项目中从模型生成.edmx。然后,您可以使用POCO代码生成器或自跟踪实体生成器生成实体并将其存储在不同的项目中。或者,您也可以像以前那样手动编写它们。属性名称必须与数据库中的列对应。

实体框架,如MVC,在配置上使用了很多约定。这意味着它会假设某些事情,除非你告诉它不要这样做

然而,根据你提供的信息,这里确实有些奇怪。根据SQL查询,这是来自Comments表,但是您的fluent映射表示DataPartId是主键。是否有其他主键映射?否则,您的映射可能是错误的。您是否检查了实际生成的数据库,以查看数据模型是否与您尝试执行的操作相匹配


我的猜测是,您的StatusMessage和Album类具有用于注释的导航属性,但由于您只将DataPartId定义为主键,因此它用于查找注释的值,而不是CommentId。

问题不在您显示的映射或类中。检查您的
相册
状态信息
课程。它们是实体吗?它们有地图吗?它们是否具有指向注释的集合导航属性?如果是,EF希望
注释
必须对这些表具有FK。如果表中没有此类列,则无法在这些实体中映射这些导航属性


顺便说一句,
Comments
表中的id不应该是
CommentId
而不是
DataPartId

您如何使用实体框架?您是使用fluent映射还是使用edmx文件?你在使用设计师内置的逆向工程吗?实体框架的哪个版本?能否发布数据模型相关部分的屏幕截图?显示模型、POCO类或自定义DbContext。看起来它们可能是代码优先生成的外键字段。这些字段是否存在于生成的数据库表中?生成SQL的依据是什么?这是Linq查询吗?查询是什么?否。CommentId是其他人设置的唯一标识符。DataPartId是我们自己模式的唯一标识符,它链接到一个集中的表,该表允许我们以统一的格式将这些内容关联在一起-这很重要,因为我们正在构建的产品的主要功能之一是数据聚合和分析。此外,bullseye:有人在我不知道的情况下在StatusMessage和Album上添加了导航属性。我已经删除了这些,单元测试现在显示了不同的错误。感谢您的帮助,+1并接受了。这是一个奇怪的错误,刚刚经历了类似的考验。删除导航属性时,请始终确保也从相关表中删除它们。是的,有人在未正确连接配置中的外键的情况下添加了导航属性。我只是不知道如何解释这个错误。感谢您的帮助。请不要建议将流程更改作为解决问题的主要方法。这是没有帮助的。由于商店安全标准,我无法真正理解为什么在这种情况下它是无益的,但请继续考虑这些解决方案作为第二、第三或最后的手段。对不起,我只是想帮助。我的第一个猜测并没有那么糟糕,因为我不知道您是如何使用实体框架的。在实体中进行简单的文本搜索可能会有所帮助。我希望我的进一步解释将来能对你有所帮助。我不知道你在这个项目中有多远。我的回答真的那么糟糕以至于我被投了反对票吗?至少我尽力了。
public IDbSet<WhateverPoco> PocoDatabaseTableAccessor { get; set; }
    HasRequired (x => x.DataPart)
        .WithRequiredDependent (x => x.Comment);

    HasRequired (x => x.CommentType)
        .WithMany (x => x.Comments)
        .HasForeignKey (x => x.CommentTypeId);

    HasKey (x => x.DataPartId);
    ToTable ("Comments", "dbo");