实体框架更新属性而不加载相关实体

时间:2012-09-25 15:17:47

标签: entity-framework orm

我有一个直截了当的场景

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)
    {
          ...
    }
}

1 个答案:

答案 0 :(得分: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;