1

我有一个直截了当的场景

class Person
{
    [Required]
    public int Age {get;set;}

    [Required]
    public virtual Pet Pet {get;set;}
}

class Pet
{
      ...
}

Person&都Pet映射在上下文中。延迟加载已启用。如果我尝试更新此人的年龄,我会收到一个验证错误,说明Pet是必需的。

var person = context.People.Find(id)
person.Age = 30;
context.SaveChanges(); //causes validation error.

我认为我不需要为上下文加载相关实体来生成正确的 sql 语句。我错过了什么,还是这不可能?

鉴于 EF 为此提供的有限选项的解决方案,我通过ActionFitler

public class DoNotValidateEntityFrameworkAttribute
    : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext
            .ControllerContext
            .Configuration
            .DependencyResolver
            .GetService<DbContext>()
            .Configuration
            .ValidateOnSaveEnabled = false;

        base.OnActionExecuting(actionContext);
    }
}

class MyController : ApiController
{
    [DoNotValidateEntityFramework]
    public void Put(int id, Model model)
    {
          ...
    }
}
4

1 回答 1

0

一种选择是改用它:

class Person
{
    [Required]
    public int Age {get;set;}

    [Required]
    public int PetId { get; set; }

    public virtual Pet Pet {get;set;}
}

这将只需要 FK 而不是实体。其他选项是关闭验证,因为它不支持不完整的对象图:

context.Configuration.ValidateOnSaveEnabled = false; 
于 2012-09-25T15:23:26.910 回答