ASP.NET MVC/实体框架错误 - 列名称“Environment_Id”无效
本文关键字:Environment Id 无效 MVC NET 实体 框架 错误 ASP | 更新日期: 2023-09-27 18:32:50
我是MVC和EF ASP.NET 新手,希望这不是一个愚蠢的问题
当我传递模型以查看时,我收到此错误 - 异常详细信息: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"
)
)
在ProfileVersion
和ServerInfo
实体中,您有一个Environment
导航属性。默认情况下,实体框架将尝试创建名为 [Property Name]_[Referenced class PK]
的数据库列。在您的方案中,这是Environment_Id
.现在的问题是,您尚未执行迁移以创建此数据库列。
如果我必须想象这里发生了什么,我会说你首先创建了具有EnvironmentId
属性的类,然后迁移,然后决定添加导航属性(Environment
到每个属性(,期望 EF 将其与现有的 EnvironmentId
属性相关联。这就是你出错的地方。正如我上面所说,EF 约定是查找名为 Environment_Id
的数据库列,因此如果您希望 EF 改用 EnvironmentId
,您只需使用ForeignKey
数据注释告诉它:
[ForeignKey("Environment")]
public int EnvironmentId { get; set; }
就我而言,我已将我的主键关系添加到同一键..所以我只是删除了..
我意识到这个问题现在已经 3 岁了,但我看到了错误的不同原因——无论是在原始问题中还是在我自己的代码中都非常相似。 而且,就我而言,我遇到了与上述相同的错误。
我有一个"MY_ACTIONS"表,其中包含 ID 和 Name 对,我想将其添加到下拉列表中。 这是模型:
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; }
}
}
为了在下拉列表中显示操作,它在我的主表中名为 LASTACTION
的int
字段中设置了一个 ID。 在该模型中,我声明了外键关系:
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" })
。为此,我在控制器函数中使用此 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
的表中的主键(该模型未在上面显示(。
不过,对我来说,我已经有了,但我仍然遇到错误,所以这样做仍然可能无法解决所有问题。
事实证明,我所要做的就是摆脱MY_ACTIONS
模型和this.o_actions = new HashSet<MY_ACTIONS>();
线中的ICollection<MY_ACTIONS> o_actions
,一切都很好。
在上面的问题中,有很多这样的列表和ICollections
在起作用,所以我敢打赌,拥有它们也有问题。 从表示字段的普通模型开始,然后添加表示使用外键链接到的表的虚拟对象。 然后确保下拉列表加载。 只有在那之后,你才应该开始添加你的ICollections
、HashSets
、Lists<T>
和其他实际上不是数据库物理组成部分的设施——这可能会让实体框架认为它需要对它们做一些它不需要做的事情。