【问题标题】:Wrong select query generated with Entity Framework (mysterious extra column)使用实体框架生成的错误选择查询(神秘的额外列)
【发布时间】:2016-03-09 20:57:12
【问题描述】:

我正在尝试让一个简单的 MVC 网站正常工作。在其中,我使用数据库和实体框架与其通信(就像我在其他项目中所做的几个月一样)。

在我尝试从数据库中的特定表中检索之前,一切都很好。如果我查询,EF 生成的选择神秘地包含该表(或该数据库中的任何表)中不存在的列。这当然会引发一个异常,抱怨该列不存在:

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:列名“PerformerFolder_Id”无效。

我创建了一个 UnitOfWork 对象,它使用存储库模式来检索数据,为了使其尽可能简单,我公开了 DataContext 以便我可以手动查询它以进行测试:

var test = loUnitOfWork.Context.Set<DAL.File>();

DAL.File 是 POCO 生成器生成的类:

public partial class File : BaseEntity
{
    public int Id { get; set; }
    public string FilePath { get; set; }
    public string FileName { get; set; }

    public virtual ICollection<FilePerformer> FilePerformerCollection { get; set; }
    public virtual ICollection<FileProperty> FilePropertyCollection { get; set; }

    public File()
    {
        FilePerformerCollection = new List<FilePerformer>();
        FilePropertyCollection = new List<FileProperty>();
        InitializePartial();
    }
    partial void InitializePartial();
}

我确实有一个PerformerFolder,它有一个Id 列作为主键,但它与文件表没有任何关系。

如果我在 DataContext 上启用调试日志记录,我会看到它运行以下查询:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[FilePath] AS [FilePath], 
    [Extent1].[FileName] AS [FileName], 
    [Extent1].[PerformerFolder_Id] AS [PerformerFolder_Id]
    FROM [dbo].[File] AS [Extent1]

我尝试在所有文件中搜索“PerformerFolder”,除了逻辑位置(在 PerformerFolder 类中)之外,它没有找到任何东西。它似乎是基于某些东西生成的,但我就是不知道是什么或在哪里。

有人有什么建议吗?

【问题讨论】:

  • 你有文件实体的部分类吗?
  • 它是一个部分类,但除了生成的类之外,不存在。
  • PerformerFolder 是否有其他部分类?
  • PerformerFolderFiles 的列表吗?
  • 我认为您必须向我们展示数据模型(不仅仅是文件)或尝试创建一个简短的自包含可编译示例。从这里开始只是猜测。

标签: c# linq entity-framework-6


【解决方案1】:

尝试在所有代码文件中搜索不带“id”的PerformerFolder EF 自行将其添加到导航属性中。

正如@Giorgi 提到的,它一定是某个地方的部分类,或者可能是以前构建的遗留物?

【讨论】:

  • 这应该是一条评论,真的。但是请参阅我已尝试在所有文件中搜索“PerformerFolder”,部分类问题现在也很清楚了。
  • 我就是这么做的。我看到的所有位置都是预期的,与 File 无关。在 DataContext 类(声明接口和类本身,以及在 CreateModel 和 OnModelCreating 函数中)以及生成的 Performer 和 PerformerFolder 类中。我也尝试清理我的解决方案并重建,但这是一个新项目,所以真的没有任何剩余
  • 在关于我的问题的 cmets 中,我回答说将 [NotMapped] 放在 PerformerFolder 部分类中的吸气剂上方修复了它。我试图创建一个精简的项目以便能够在这里共享,并看到删除那个我确信是空的部分类,解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多