Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体类型列表“1”不是当前上下文的模型的一部分_C#_Asp.net Mvc 3_Entity Framework 4.1 - Fatal编程技术网

C# 实体类型列表“1”不是当前上下文的模型的一部分

C# 实体类型列表“1”不是当前上下文的模型的一部分,c#,asp.net-mvc-3,entity-framework-4.1,C#,Asp.net Mvc 3,Entity Framework 4.1,我一直在使用数据库第一,EF4.1 尝试从编辑视图更新记录时出现“实体类型列表`1不是当前上下文模型的一部分”错误 错误发生在 db.Entry(properties).State = EntityState.Modified; 这是我的模型: public class Users { [Key] public int User_ID { get; set; } public string UserName { get; set; } [No

我一直在使用数据库第一,EF4.1

尝试从编辑视图更新记录时出现“实体类型列表`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; }
}
公共类用户
{
[关键]
公共int用户_ID{get;set;}
公共字符串用户名{get;set;}
[未映射]
公共IEnumerable用户属性
{
获取{return Properties.Where(u=>u.User_ID==User_ID);}
}
公共虚拟ICollection属性{get;set;}
}
公共类应用程序属性
{
[关键]
public int Prop_ID{get;set;}
公共int用户_ID{get;set;}
public int App_ID{get;set;}
公共字符串密钥{get;set;}
公共字符串值{get;set;}
public DateTime DateEntered{get;set;}
公共日期时间日期修改{get;set;}
[外键(“用户ID”)]
公共虚拟用户用户{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);
}
[HttpPost]
公共操作结果编辑(ICollection属性)
{
if(ModelState.IsValid)
{
foreach(属性中的变量项)
{
db.Entry(properties).State=EntityState.Modified;
}
db.SaveChanges();
返回操作(“索引”);
}
返回视图(属性);
}
我怀疑foreach循环不适合为ICollection中的每个项设置EntityState


如蒙协助,将不胜感激

尝试将循环更改为:

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

您正在调用
db.Entry(properties)
,因此您试图一次附加整个集合。DbContext.Entry(object),不是一个集合。

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

出于价值考虑,我更喜欢将我的
EntityState.Modified
赋值保留在一行上(因为我有多行),因此使用以下LINQ:

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

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

entityList.ForEach(context.Insert);

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

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);
}

一个简短的语义注释,App_Properties.Users这个名称意味着多个用户,而不是一个。通常情况下,单个对象的名称都是单数,比如说
var users=new users()
意味着一组人,而不是一个项目。是的,谢谢。。。我无法控制DB,我让表的不正确命名传播到我的代码中。不过,DB名称不必如此-在ModelCreating:
modelBuilder.Entity().ToTable(“用户”)
上更改POCO到实际数据库表的映射非常容易。用户类上的简单F2重命名将在整个项目中传播重命名。与属性名称相同-您可以自定义映射其中任何一个。谢谢这消除了该错误,但添加了一个“objectstatemanager错误中已存在具有相同密钥的对象”。我可以从中获得有关该错误的帮助。谢谢。。。这很有帮助,我从你的回答中得到了一个想法,所以我做了以下事情:我使用代码优先的方法,LazyLoadingEnabled=false,我有一个针对状态的操作集合,所以我加载了dbContext.Entry(status.collection)(c=>c.actions.Load();它工作得很好,但当我发现有一个对象与每个Action NextStatus相关时,问题就出现了,所以我使用了以下内容:foreach(status.Actions中的var a){dbContext.Entry(a).Reference(c=>c.nextStatsu.Load();}