实体框架:从哪里获取这些列?

时间:2011-11-23 20:30:37

标签: c# database entity-framework

我们正在尝试使用现有数据库在我们的商店中运行实体框架(因此,更改数据库模式不是一个选项),我们为测试事物而创建的单元测试显示出一些非常奇怪的行为。

这是它为我们拥有的特定对象吐出的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)我们正在使用Entity Framework 4.2。我们正在使用流畅的映射。

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;

除此之外,Context文件还有很多

modelBuilder.Configurations.Add(new WhateverConfiguration()) 

public IDbSet<WhateverPoco> PocoDatabaseTableAccessor { get; set; }

4)我们从db-first开始,但是没有用,所以我们目前正在以代码优先。

5)这是特定POCO的配置内容:

    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");

3 个答案:

答案 0 :(得分:4)

问题不在于您展示的地图或课程。检查您的AlbumStatusMessage课程。他们是实体吗?它们被映射了吗?他们有评论的集合导航属性吗?如果是,EF希望Comment必须对这些表有FK。如果表没有这样的列,则不能在这些实体中映射这些导航属性。

顺便说一下。 Comments表中的ID不应该是CommentId而不是DataPartId吗?

答案 1 :(得分:1)

与MVC一样,实体框架使用了大量的约定优于配置。这意味着它假设某些事情,除非你告诉它不要。

但是,根据您提供的信息,这里真的很奇怪。根据SQL查询,这来自Comments表,但是您的流畅映射表明DataPartId是主键。您是否有其他主键流畅映射?如果没有,您的映射可能是错误的。您是否检查了生成的实际数据库,以查看数据模型是否与您尝试执行的操作相匹配?

我的猜测是你的StatusMessage和Album类具有Comment的导航属性,但由于你只定义了DataPartId作为主键,所以它是用来查找注释的值,而不是CommentId。

答案 2 :(得分:0)

在XML-Editor中打开.edmx并搜索这些列。它们必须位于模型中的某个位置。

编辑:您的原始问题没有提及您是否首先使用代码。我想知道你的数据库首先出现了什么问题,通常效果很好。首先使用代码优先或模型,通常在创建模型后使用生成的SQL脚本创建数据库。

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

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