【问题标题】:Updating a reference to a child object in Entity framework 4.1 (CodeFirst)在实体框架 4.1 (CodeFirst) 中更新对子对象的引用
【发布时间】:2011-12-12 15:22:35
【问题描述】:

我正在尝试更新我之前使用 EntityFramework 4.1 (CodeFirst) 保存的对象

Job 类具有以下属性...

public class Job
{
    [key]
    public int Id { get; set; }
    public string Title { get; set; }
    public Project Project { get; set; }
    public JobType JobType { get; set; }
    public string Description { get; set; }
}

初始创建工作正常,但更新只提交对字符串的更改..

如果我将子对象(例如 JobType 属性从 JobTypeA 更改为 JobTypeB - 未提交更改...

我不打算对 JobType 进行更改 - 只是对 Job。

using (var context = new JobContext())
{
    context.Jobs.Attach(job);
    context.Entry(job).State = EntityState.Modified;
    context.SaveChanges();
}

查看 SQL Profiler - 甚至没有为更新发送 Id - 但是它们用于初始插入!

【问题讨论】:

    标签: c# entity-framework ef-code-first code-first


    【解决方案1】:

    将状态设置为Modified 只会更新标量和复杂属性,而不是您的导航属性。这仅通过实体框架的更改检测。这意味着你需要从数据库中加载原件:

    using (var context = new JobContext())
    {
        var originalJob = context.Jobs.Include(j => j.JobType)
            .Single(j => j.Id == job.Id);
    
        // Update scalar/complex properties
        context.Entry(originalJob).CurrentValues.SetValues(job);
    
        // Update reference
        originalJob.JobType = job.JobType;
    
        context.SaveChanges();
    }
    

    在您的情况下,您可能还可以利用一些“技巧”:

    using (var context = new JobContext())
    {
        var jobType = job.JobType;
        job.JobType = null;
    
        context.JobTypes.Attach(jobType);
        context.Jobs.Attach(job);
        // change detection starts from here,
        // EF "thinks" now, original is JobType==null
    
        job.JobType = jobType;
        // change detection will recognize this as a change
        // and send an UPDATE to the DB
    
        context.Entry(job).State = EntityState.Modified; // for scalar/complex props
    
        context.SaveChanges();
    }
    

    如果您想将JobType 设置为null,它不会起作用。

    这是一种典型情况,如果您将外键作为模型中的属性公开,则会变得更加简单:使用 JobTypeId 在您的 Job 实体中,您的代码可以工作,因为 FK 属性是标量并将状态设置为Modified 也会将此属性标记为已修改。

    【讨论】:

    • “这是一种典型的情况,如果你在模型中将外键作为属性公开,这种情况会变得更加简单” THIS。这应该包含在每个 EF 教程中。令人难以置信的是它如何让事情“正常工作”。
    • @EugenTimm 在更新分离的时候它是如何工作的?您是更新导航属性还是 FK?
    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多