无效的对象名称异常是指我尚未创建的对象

时间:2015-08-17 19:13:00

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

目前,我正在尝试使用EntityFramework从数据库中提取信息。因此,我已连接到正确的数据库:

<add name="ChartConn" connectionString="Data Source=****;Initial Catalog=****;User ID=****;Password=****;" providerName="System.Data.SqlClient" />

用星号填写该数据库的正确个人信息。

问题是当我尝试从我的控制器中使用以下内容从此数据库中提取信息时:

public ActionResult Index()
{
    var q = (from c in db.ChannelMaps
            select c.LABEL).ToList();

    return View(q);
}

以及模型中的以下内容:CHANNELMAP:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace ChartApp.Models
{
    public class CHANNELMAP
    {
        [Key]
        public int CHANNELNUM { get; set; }
        public int COLUMNID { get; set; }
        public string LABEL { get; set; }
        public string RAWUNITS { get; set; }
        public double? MULT { get; set; }
        public double? ADDER { get; set; }
        public int? DATATYPEID { get; set; }
        public int? OPCODEID { get; set; }
        public decimal? OPVALUE { get; set; }
        public int? SITEID { get; set; }
        public string DASNAME { get; set; }
    }

    public class ChannelMapContext : DbContext
    {
        public ChannelMapContext()
            : base("ChartConn")
        {
            Database.SetInitializer<Models.ChannelMapContext>(null);
        }

        public DbSet<CHANNELMAP> ChannelMaps { get; set; }

    }
}

我收到错误:无效的对象名dbo.CHANNELMAPs,指向我控制器中linq查询的第一行(from c in db.ChannelMaps)。这很奇怪,因为我的模型的名称是CHANNELMAP,所以我不确定为什么我为一个我没有使用的对象的无效名称收到错误。导致此错误的原因是什么?我已经尝试多次更改模型的名称,以及三重检查以确保我的连接字符串和属性名称都相应地设置。

2 个答案:

答案 0 :(得分:2)

默认情况下,EF会添加&#39; (复数化)在模型中的每个实体的末尾。要删除它,您只需删除该约定:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
 }
  

异常详细信息:System.Data.SqlClient.SqlException:无效的对象   名称&#39; dbo.CHANNELMAPs&#39;

此错误意味着EF正在将您的LINQ转换为使用表的sql语句,该表在数据库中不存在。

检查您的数据库并验证该表是否存在,或者您应该使用其他表名。

答案 1 :(得分:1)

实体框架按惯例假定表名是实体名称的复数版本(因此引用CHANNELMAPs的错误消息)。如果您的实体实际上被称为CHANNELMAP,请向其添加Table属性。

[Table("CHANNELMAP")]
public class CHANNELMAP
    { ...

有关详情,请参阅此处:Howto specify table name with Entity Framework Code First Fluent API