EF 中的自定义模型活页夹不加载异步中的子实体
Custom model binder in EF do not load child entities in Async
我正在使用 Entity Framework 6.1.1,当我在异步调用中使用自定义模型联编程序时,它会抛出异常,因为子实体 (Brand) 未加载且是强制性的。我正在使用 ninject,我已更新到最新版本 (
3.2.2.0)
这是代码:
public class PlayerModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var context = DependencyResolver.Current.GetService<DbContext>();
var id = ModelBinderHelpers.GetA<Guid>(bindingContext, "id");
if (id == null || !id.HasValue)
throw new HttpException(404, "Not found");
var entity = context.Set<Player>().Find(id);
if (entity == null)
throw new HttpException(404, "Not found");
return entity;
}
}
这会起作用:
public ActionResult Deactivate(Player player)
{
try
{
player.Deactivate();
DbContext.SaveChanges();
}
catch (Exception ex)
{
var b = ex;
}
FlashBag.AddMessage(
FlashType.Success,
Strings.Player_DeactivatedSuccessfully);
return RedirectToAction("Index");
}
但这不起作用:
public async Task<ActionResult> Deactivate(Player player)
{
try
{
player.Deactivate();
await DbContext.SaveChangesAsync();
}
catch (Exception ex)
{
var b = ex;
}
FlashBag.AddMessage(
FlashType.Success,
Strings.Player_DeactivatedSuccessfully);
return RedirectToAction("Index");
}
感谢您的帮助!
看完this post
我最终这样做了:
public class PlayerModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var context = DependencyResolver.Current.GetService<DbContext>();
var id = ModelBinderHelpers.GetA<Guid>(bindingContext, "id");
if (id == null || !id.HasValue)
throw new HttpException(404, "Not found");
var entity = context.Set<Player>()
.Include(x => x.Brand)
.FirstOrDefault(x => x.Id == id);
if (entity == null)
throw new HttpException(404, "Not found");
return entity;
}
}
我正在使用 Entity Framework 6.1.1,当我在异步调用中使用自定义模型联编程序时,它会抛出异常,因为子实体 (Brand) 未加载且是强制性的。我正在使用 ninject,我已更新到最新版本 ( 3.2.2.0) 这是代码:
public class PlayerModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var context = DependencyResolver.Current.GetService<DbContext>();
var id = ModelBinderHelpers.GetA<Guid>(bindingContext, "id");
if (id == null || !id.HasValue)
throw new HttpException(404, "Not found");
var entity = context.Set<Player>().Find(id);
if (entity == null)
throw new HttpException(404, "Not found");
return entity;
}
}
这会起作用:
public ActionResult Deactivate(Player player)
{
try
{
player.Deactivate();
DbContext.SaveChanges();
}
catch (Exception ex)
{
var b = ex;
}
FlashBag.AddMessage(
FlashType.Success,
Strings.Player_DeactivatedSuccessfully);
return RedirectToAction("Index");
}
但这不起作用:
public async Task<ActionResult> Deactivate(Player player)
{
try
{
player.Deactivate();
await DbContext.SaveChangesAsync();
}
catch (Exception ex)
{
var b = ex;
}
FlashBag.AddMessage(
FlashType.Success,
Strings.Player_DeactivatedSuccessfully);
return RedirectToAction("Index");
}
感谢您的帮助!
看完this post
我最终这样做了:
public class PlayerModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var context = DependencyResolver.Current.GetService<DbContext>();
var id = ModelBinderHelpers.GetA<Guid>(bindingContext, "id");
if (id == null || !id.HasValue)
throw new HttpException(404, "Not found");
var entity = context.Set<Player>()
.Include(x => x.Brand)
.FirstOrDefault(x => x.Id == id);
if (entity == null)
throw new HttpException(404, "Not found");
return entity;
}
}