【发布时间】:2012-03-27 19:44:53
【问题描述】:
我一直在使用数据库优先,EF 4.1
我收到“实体类型 List`1 不是当前上下文模型的一部分。”尝试从我的编辑视图更新记录时出错。
错误发生在
db.Entry(properties).State = EntityState.Modified;
这是我的模型:
public class Users
{
[Key]
public int User_ID { get; set; }
public string UserName { get; set; }
[NotMapped]
public IEnumerable<App_Properties> User_Properties
{
get { return Properties.Where(u => u.User_ID == User_ID); }
}
public virtual ICollection<App_Properties> Properties { get; set; }
}
public class App_Properties
{
[Key]
public int Prop_ID { get; set; }
public int User_ID { get; set; }
public int App_ID { get; set; }
public string Key { get; set; }
public string Value { get; set; }
public DateTime DateEntered { get; set; }
public DateTime DateModified { get; set; }
[ForeignKey("User_ID")]
public virtual Users Users { get; set; }
}
这是我的控制器:
[HttpPost]
public ActionResult Edit(ICollection<App_Properties> properties)
{
if (ModelState.IsValid)
{
foreach (var item in properties)
{
db.Entry(properties).State = EntityState.Modified;
}
db.SaveChanges();
return RedirectToAction("Index");
}
return View(properties);
}
我怀疑 foreach 循环不适合为 ICollection 中的每个项目设置 EntityState。
任何帮助将不胜感激。
【问题讨论】:
-
快速语义注释,名称 App_Properties.Users 表示多个用户,而不是一个。约定往往是单个对象有一个单数名称,因为
var users = new Users()表示一组人,而不是单个项目。 -
是的,谢谢...我无法控制数据库,我让不正确的表命名传播到我的代码中。
-
数据库名称不必如此 - 将 POCO 的映射更改为实际数据库表 OnModelCreating:
modelBuilder.Entity<User>().ToTable("Users")非常容易。用户类上的简单 F2 重命名然后将在您的项目中传播重命名。与属性名称相同 - 您可以自定义映射其中的任何一个。 weblogs.asp.net/scottgu/archive/2010/07/23/…
标签: c# asp.net-mvc-3 entity-framework-4.1