ASP.NET MVC /实体框架错误 - 无效的列名称'Environment_Id'

时间:2013-09-25 16:42:39

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

我是ASP.NET MVC和EF的新手,希望这不是一个愚蠢的问题

当我传递模型以查看我收到此错误 - 异常详细信息:System.Data.SqlClient.SqlException:无效的列名称'Environment_Id'。

模型或数据库表具有该名称的属性。可以指导我吗?。

  **Here is the Version Model Class**

  public partial class Version
  {
    public Version()
    {
        this.ProfileVersions = new List<ProfileVersion>();
        this.ServerInfoes = new List<ServerInfo>();
    }

    public int Id { get; set; }
    public string Number { get; set; }
    public string Tag { get; set; }
    public string Owner { get; set; }
    public string Approver { get; set; }
    public string Description { get; set; }
    public virtual ICollection<ProfileVersion> ProfileVersions { get; set; }
    public virtual ICollection<ServerInfo> ServerInfoes { get; set; }
}

**Profile Version Class**

public partial class ProfileVersion
{
    public ProfileVersion()
    {
        this.PlatformConfigurations = new List<PlatformConfiguration>();
    }

    public int Id { get; set; }
    public int ProfileId { get; set; }
    public int EnvironmentId { get; set; }
    public int VersionId { get; set; }
    public Nullable<bool> Locked { get; set; }
    public string LockedBy { get; set; }
    public string Comments { get; set; }
    public Nullable<int> Active { get; set; }
    public virtual Environment Environment { get; set; }
    public virtual ICollection<PlatformConfiguration> PlatformConfigurations { get;  
                                                                             set; }
    public virtual PlatformProfile PlatformProfile { get; set; }
    public virtual Version Version { get; set; }
}

**ServerInfo** 
public partial class ServerInfo
{
    public ServerInfo()
    {
        this.PlatformConfigurations = new List<PlatformConfiguration>();
    }

    public int Id { get; set; }
    public string ServerName { get; set; }
    public int ProfileId { get; set; }
    public int VersionId { get; set; }
    public int EnvironmentId { get; set; }
    public string ServerType { get; set; }
    public Nullable<short> Active { get; set; }
    public string Domain { get; set; }
    public string Location { get; set; }
    public string IP { get; set; }
    public string Subnet { get; set; }
    public string Gateway { get; set; }
    public Nullable<int> VLan { get; set; }
    public string DNS { get; set; }
    public string OS { get; set; }
    public string OSVersion { get; set; }
    public string Func { get; set; }
    public Nullable<short> IISInstalled { get; set; }
    public string ADDomainController { get; set; }
    public string ADOrganizationalUnit { get; set; }
    public string ADGroups { get; set; }
    public string LastError { get; set; }
    public Nullable<System.DateTime> LastUpdate { get; set; }
    public virtual Environment Environment { get; set; }
    public virtual ICollection<PlatformConfiguration> PlatformConfigurations { get;      
                                                                             set; }
    public virtual PlatformProfile PlatformProfile { get; set; }
    public virtual Version Version { get; set; }
    public virtual VMConfiguration VMConfiguration { get; set; }
}

 **Controller Code-**

 public ViewResult Index(string id )
    {

        var profileVerList = from ver in _context.Versions
                                where !(from pfv in _context.ProfileVersions
                                    select pfv.VersionId).Contains(ver.Id)
                                select ver;

        var bigView = new BigViewModel
        {
            VersionModel = profileVerList.ToList(),                
        };

        return View(model: bigView);
    }


**In the View where the exception is thrown**

 @Html.DropDownList(
            "SelectedVersionID", 
            new SelectList(
                Model.VersionModel.Select(x => new { Value = x.Id, Text = x.Number}),
                "Value",
                "Text"
                )
            )

3 个答案:

答案 0 :(得分:10)

ProfileVersionServerInfo个实体中,您拥有Environment导航属性。默认情况下,Entity Framework将尝试创建名为[Property Name]_[Referenced class PK]的数据库列。在您的方案中,即Environment_Id。现在的问题是,您尚未完成迁移以创建此数据库列。

如果我不得不想象这里发生了什么,我说你首先创建了具有EnvironmentId属性的类,已迁移,然后决定为每个类添加导航属性Environment,期望EF将其与您现有的EnvironmentId属性相关联。那是你出错的地方。如上所述,EF约定是查找名为Environment_Id的数据库列,因此如果您希望EF使用EnvironmentId,您只需要使用ForeignKey数据来说明这一点注释:

[ForeignKey("Environment")]
public int EnvironmentId { get; set; }

答案 1 :(得分:0)

在我的情况下,我已将我的主键关系添加到相同的键..所以我只需删除..

答案 2 :(得分:0)

我意识到这个问题已经3年了,但是我看到错误的另一个原因-在原始问题和我自己的代码中都非常相似。而且,就我而言,我遇到了与上述相同的错误。

我有一个“ MY_ACTIONS”表,该表具有要添加到下拉列表中的ID和名称对。这是模型:

namespace TestSite.Models
{
    public class MY_ACTIONS
    {
        //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public MY_ACTIONS()
        {
            this.o_actions = new HashSet<MY_ACTIONS>();
        }

        [Key]
        public int action_id { get; set; }

        [StringLength(100)]
        public string action_name { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<MY_ACTIONS> o_actions { get; set; }
    }
}

要在下拉菜单中显示一个操作,它在我的主表的int字段中设置了一个ID,名为LASTACTION。在该模型中,我声明了ForeignKey关系:

namespace TestSite.Models
{    

    [Table("MAIN_TABLE")]
    public partial class MAIN_TABLE
    {
        [Key]
        public int MAIN_TABLE_ID { get; set; }

        public int LASTACTION { get; set; } // this would carry a number matching action_id

        [ForeignKey("LASTACTION")]
        public virtual MY_ACTIONS MY_ACTIONS { get; set; }
    }
}

在我的视图中加载此下拉列表时出现错误Invalid column name 'MY_ACTIONS_action_id'

@Html.DropDownList("lastaction", null, htmlAttributes: new { @class = "form-control" })

...为此,我在Controller函数中使用了此ViewBag:

Model1 db = new Model1(); // database context

MAIN_TABLE o_main = new MAIN_TABLE();
o_main.lastaction = 2;

ViewBag.lastaction = new SelectList(db.MY_ACTIONS, "action_id", "action_name", o_main.lastaction);

如果我没有声明我的FK关系:

[ForeignKey("LASTACTION")]
public virtual MY_ACTIONS MY_ACTIONS { get; set; }

我可能也会遇到同样的问题。具有虚拟实例的表示形式需要将其与某些物理属性链接。这类似于以下方式:

public virtual Environment Environment { get; set; }

应该是:

[ForeignKey("EnvironmentId")]
public virtual Environment Environment { get; set; }

在上述问题中的ProfileVersion类中,假设EnvironmentId是名为Environment的表中的主键(该模型未在上面显示)。

但是,对我来说,我已经有了它,并且仍然遇到错误,所以这样做仍然不能解决所有问题。

结果证明,我要做的就是摆脱ICollection<MY_ACTIONS> o_actions模型中的MY_ACTIONSthis.o_actions = new HashSet<MY_ACTIONS>();行,一切都顺利进行了。

上面的问题中有许多这样的列表和ICollections在起作用,所以我也认为拥有它们有问题。从仅表示字段的普通模型开始,然后添加表示与外键链接的表的虚拟对象。然后,确保下拉列表加载。只有在那之后,您才应该开始添加ICollectionsHashSetsLists<T>和其他实际上不是数据库物理组成部分的便利设施-这可能会使Entity Framework陷入认为需要的地方与他们做一些不需要做的事情。