- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的模型 Binder :
public class PersonBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// ...
// id = routevalues[ id ]
var db = controllerContext.HttpContext.GetOwinContext().Get<ApplicationDbContext>();
return db.Set<Person>().FirstOrDefault(o => o.Id == id);
}
}
而且效果很好。这里例如:
public ActionResult Edit(Person entity, int? id)
{
if (entity == null && id.HasValue)
throw new HttpException(404, "Person not found.");
return View(person);
}
问题是当我尝试将它保存在数据库中时:
// DbContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>()
[HttpPost]
public async Task<ActionResult> Edit(Person entity, int? id)
{
if (entity == null && id.HasValue)
throw new HttpException(404, "Person not found.");
if (ModelState.IsValid)
{
// WORKS when inserting a new person to the database
if (!id.HasValue)
DbContext.People.Add(entity);
else
{
// if I try to attach I get an error: see bellow
// if I don't attach, it does nothing
}
await DbContext.SaveChangesAsync();
}
return View(entity);
}
附加错误:
System.InvalidOperationException: Attaching an entity of type '..Person' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
当我在 Controller 操作中运行它时,实体状态显示为 Detached
:
DbContext.Entry(entity).State
为什么会这样?我该如何解决?不能为此使用 Binder 吗?
最佳答案
在执行附加之前,如果您分离现有实体会怎样?类似于:(未测试 - 抱歉,这是基于旧项目中的一些代码,我们出于不同的原因不得不做类似的事情,但希望能给出想法)
if (!id.HasValue)
DbContext.People.Add(entity);
else
{
var attachedEntity = DbContext.People.Find(id);
if (attachedEntity != null && DbContext.Entry(attachedEntity).State != EntityState.Detached)
{
DbContext.Entry(attachedEntity).State = EntityState.Detached;
// You may need to recursively detach child entities here if any
}
DbContext.People.Attach(entity);
DbContext.Entry(entity).State = EntityState.Modified;
}
编辑:
因为主要问题似乎是您的 DbContext 实例不同,考虑到 IOwinContext.Get<T>
的文档,这是有道理的说“从 OWIN 环境获取值,如果不存在则返回默认值 (T)。”
http://msdn.microsoft.com/en-us/library/dn270607(v=vs.113).aspx
,你能不能在某个地方(我没有经常使用 OWIN,所以不确定最好的地方在哪里 - 但我猜在你的管道的开头)调用 IOwinContext.Set<ApplicationDbContext>
并向其传递一个新的 DbContext,以便您对 HttpContext.GetOwinContext().Get() 的 2 个调用共享同一个实例?
关于c# - 如何将 ModelBinders 与存储在 OwinContext 中的 DbContext 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25955652/
有人能告诉我在 global.asax 中使用 [ModelBinder()] 属性与通过 ModelBinders.Add() 注册模型绑定(bind)器的优缺点吗? 我能想到的一个优点是它更明确,
我想创建一个基于 CMS 内容的动态表单。我的字段(以及更多属性)的标签将在 CMS 中生成。为了说明,我在 Controller GET 操作中静态创建了 View 模型。使用自定义模型绑定(bin
我有一个自定义的 ModelBinder,它使用这样的代码将 web 与对象绑定(bind)" [ModelBinder(typeof(CustomizedModelBinder))]
我正在尝试创建一个非常简单的表单来从模型集合中发回一些值 当我单击“提交”时,查看返回的集合,它不包含任何对象。我还发现 asp-for 没有生成我期望的集合索引。 我有一个简单的模型 public
我有一个问题,我正在开发一个 asp.net mvc 项目。网站使用土耳其语。当我将此网站发布到 IIS 时,土耳其语字符在网页中变得疯狂,所以我在 web.config 中将全局化设置为 在此之后
我们有一个自定义模型绑定(bind)器,可以将 json 反序列化为对象列表,我想将该模型绑定(bind)器用于多个 View ,每个 View 都使用不同的 View 模型。 我们想要避免的是必须为
正如问题标题所暗示的那样,我正在尝试通过对 MVC Controller 的 $ajax 调用来发布数组集合(如果您愿意,可以是数组数组)以绑定(bind)到 Controller 。我已经找到了所有
我遇到了一个似乎与反射和模型联编程序验证有关的问题,尤其是 FormatterParameterBinding.ExecuteBindingAsync(..),尽管我可以使用方法来执行操作如果我可以使
上下文:在 Asp.net Core 2.1 下的 WebAPI 中,我必须创建一个 POST 端点, [服务器]/MyController/{Parameter1}/MoreRouteThing/。
我有一个自定义模型 Binder ,我知道将其分配给我的操作方法的两种方法: 要么在方法上: public ActionResult MyAction([ModelBinder(typeof(MyCu
我有一个 POCO,我将其用作 MVC3 中操作的参数。像这样: 我的类型 public class SearchData { public string Property1 { get; s
我一直在用 ASP.NET MVC2 进行一些实验,并遇到了一个有趣的问题。 我想围绕将用作 MVC 应用程序中的模型的对象定义一个接口(interface)。此外,我想通过使用验证属性标记此接口(i
我在某些模型中使用了一个子模型类(UserInfo),它应该包含一些与用户相关的信息。该子模型可用于各种模型,例如 public class Model { int string Value
我有以下复杂模型: 类别 - 有 -> 列表 有 -> 列表 我正在尝试进行创建操作,我可以在其中提取所有现有类别并为每个类别插入一个列表,包括子项目。例如: -Cat1 -- 新项目组1 --- 新
我的模型上有一组对象,我正在使用 EditFor 函数在 View 中呈现这些对象,并且我有一个 EditorTemplate 负责实际呈现每个对象。 @Html.EditorFor(model =>
我有一个正在使用的 api,它将对我的服务器端方法之一执行一些 JSON 的 POST。 我正在创建一些映射到该 JSON 结构的 C# 类。我的问题是发布给我的字段之一名为“对象”,它是一个字符串。
我想创建一个不同语言的网站。我已经读到我可以创建一个 ActionFilter ,但我有一个小问题: 我必须创建一个自定义 ModelBinder 才能使用英语和德语数字格式(123,456,789.
我想为 ASP.NET MVC 编写一个模型绑定(bind)程序,它将更正用户可见的值。也许它会将值的首字母大写、修剪字符串等等。 我想将这种行为封装在模型绑定(bind)程序中。 例如,这里有一个用
我有一个正在使用的 api,它将对我的服务器端方法之一执行一些 JSON 的 POST。 我正在创建一些映射到该 JSON 结构的 C# 类。我的问题是发布给我的字段之一名为“对象”,它是一个字符串。
我已经实现了 ModelBinder,但它的 BindModel() 方法没有被调用,并且我收到错误代码 500 并显示以下消息: 错误: 不能从“MyModelBinder”创建一个“IModelB
我是一名优秀的程序员,十分优秀!