首页 > 解决方案 > 在没有单独的 id 属性的情况下更新实体框架中的外键?

问题描述

我设置了一个如下所示的实体:

public partial class Test
{
    public Test()
    {
    }

    public int Id { get; set; }
    public virtual Test2 Test2 { get; set; }
    //and some other fields
}

test2是另一个测试对象,没有导航属性:

public partial class Test2
{
     public int Id {get;set;}
     public string Name {get;set;}
}

我没有在上下文中设置模型构建器,它只有和的DbSet属性。testtest2

我正在尝试从我根据用户输入创建的未附加对象更新数据库中的一行。在这个测试用例中,Test2属性为空,我正在尝试将其更新为 3:

static void Main(string[] args)
{
    using(var context = new db.Model1())
    {
        var test = new db.Test();

        // we know id 1 exists for this simple test case
        test.Id = 1;

        // fake user input is 3 for test2 id
        test.Test2 = context.Test2.Where(x => x.Id == 3).FirstOrDefault();

        context.Test.Attach(test);
        context.Entry(test).State = System.Data.Entity.EntityState.Modified;
        context.SaveChanges();
    }
}

问题是这不会Test_Id将数据库中的列更改为 3。我错过了什么?

我已经确定,如果不是使用创建测试对象new(),而是从上下文中查询它然后更新,它可以正常工作(如下所示):

var test = context.Test.FirstOrDefault(x => x.Id == 2);
test.Test2 = context.Test2.FirstOrDefault(x => x.Id == 3);
context.SaveChanges();

如果我将对象附加到上下文并将其状态设置为已修改,为什么我的第一种方法不起作用?我可以避免没有单独test2_id的外键关系字段,这似乎是多余的吗?

标签: c#entity-framework

解决方案


推荐阅读