繁体   English   中英

实体框架 SqlException:无效的 object 名称

[英]Entity Framework SqlException: Invalid object name

我已将旧应用程序从 EF6 DB First 迁移到从现有数据库手动生成的上下文,并始终在 ASP.NET 4.7 上使用 EF6。

上下文定义如下:

namespace DataModel
{
    using System;
    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;

    public partial class MyEntities : DbContext
    {
        public MyEntities()
            : base("name=MyEntities")
        {
        }

        public virtual DbSet<Country> Countries { get; set; }        
        public virtual DbSet<SomeNameSpace.Report> RE_Reports { get; set; }
    }
}

class 实体报告定义如下:

namespace DataModel
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    namespace SomeNameSpace
    {
        public partial class Report
        {
            [Key]
            public int ReportID { get; set; }
            [StringLength(1024)]
            public string Title { get; set; }
        }
    }
}

在编译时一切正常,应用程序成功构建。 一旦我在第一次访问报告实体时运行它,我会收到以下错误:

无效的 object 名称“dbo.Reports”

因此,Entity Framework 在 SQL 中将查询表名转换为Reports ,即实体名称的复数形式,而不是转换为RE_Reports ,后者是数据库表的实际名称。

为什么?

请注意,使用其他实体(例如 Country)的查询在运行时也能正常工作。

唯一的区别是我添加到报告表中的额外命名空间。

不知道为什么您的代码不起作用(根据我读过的内容,或者当前的 ef 核心约定与 EF6 不同),但作为一种解决方法,您可以使用TableAttibute标记实体,如下所示:

[Table("RE_Reports")]
public partial class Report

因此,Entity Framework 在 SQL 中将查询表名转换为 Reports,即实体名称的复数形式,而不是转换为 RE_Reports,即数据库表的实际名称。

为什么?

因为它是实体框架中的Convention

实体框架有三个选项可以将您的实体名称转换为表名称:

  1. OnModelCreating中使用流利的方法:

    modelBuilder.Entity<Report>().ToTable("RE_Reports");

  2. 在实体 class 上使用属性(如Guru Stron回答中所述):

    [Table("RE_Reports")]

  3. 使用Convention

    如果开发人员未应用选项 1 和 2,则默认情况下,EF 会将表名推断为实体名称的复数形式(您的情况)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM