【问题标题】:The entity type List`1 is not part of the model for the current context实体类型 List`1 不是当前上下文模型的一部分
【发布时间】: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&lt;User&gt;().ToTable("Users") 非常容易。用户类上的简单 F2 重命名然后将在您的项目中传播重命名。与属性名称相同 - 您可以自定义映射其中的任何一个。 weblogs.asp.net/scottgu/archive/2010/07/23/…

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


【解决方案1】:

尝试将循环更改为:

foreach (var item in properties)
{
     db.Entry(item).State = EntityState.Modified;
}

你打电话给db.Entry(properties),所以你试图一次附加整个集合。 DbContext.Entry(object) expects a single object,不是集合。

【讨论】:

  • 谢谢.. 这消除了该错误,但添加了一个“具有相同键的对象已存在于 objectstatemanager 错误中。”我能够从 stackoverflow.com/questions/8254854/… 获得有关该错误的帮助。
  • 谢谢...这很有帮助
  • 我从你的回答中得到了一个想法,所以我做了以下事情:我使用代码优先的方法和 LazyLoadingEnabled = false 我有一个针对状态的操作集合,所以我像那个 dbContext.Entry( status).Collection(c=>c.Actions).Load();
  • 它工作正常,但是当我发现有一个与每个 Action NextStatus 相关的对象时出现问题,所以我使用了以下内容:foreach(var a in status.Actions) { dbContext.Entry(a ).Reference(c=>c.nextStatsu).Load(); }
【解决方案2】:

感谢宽恕,您的回答。工作得很好。

对于它的价值,我更喜欢将我的 EntityState.Modified 分配保留在一行(因为我有多个)所以使用以下 LINQ:

properties.ForEach(p => db.Entry(p).State = EntityState.Modified);

【讨论】:

    【解决方案3】:

    尽管使用了代码优先 EF,但我最终还是来到了这里。对我来说,这个问题的答案就是不要尝试将实体列表传递给 insert 方法,而是一次插入一个:

    entityList.ForEach(context.Insert);

    【讨论】:

      【解决方案4】:

      我认为您可以使用此代码解决此问题。因为如果你使用它,你会遇到另一个问题。现在我解决了我的问题,我希望它对你有用

      foreach (var item in properties)
      {
        var oldEntity = FGetById(item.Id); // You can use find instead of FGetById
        context.Entry(oldEntity).CurrentValues.SetValues(item);
        Update(oldEntity);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-10
        • 2014-11-30
        • 2017-06-19
        • 2011-06-26
        • 2014-01-08
        • 2014-03-29
        • 2018-02-16
        相关资源
        最近更新 更多