c# - 在没有单独的 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
属性。test
test2
我正在尝试从我根据用户输入创建的未附加对象更新数据库中的一行。在这个测试用例中,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# - 如何在 C# 中运行命令行应用程序并重定向/显示其标准输出,同时保留应用程序的颜色?
- mysql - 在 MySQL 中将新表添加到数据库时执行索引创建
- python - 对数刻度的小刻度标签格式
- azure - 从 IoT Edge 模块更新所需的属性
- google-kubernetes-engine - GKE 用户 PermissionDenied 写入指标 container.googleapis.com/internal/node/inodes
- c# - 在 C# 中从 BLE 设备读取数据
- javascript - 当一个div在悬停时翻译它时如何隐藏文本?
- java - 在 Spring Boot 中创建外键 - H2 数据库
- bash - 在 Bash 脚本中使用参数调用程序时遇到问题
- linux - 是否可以为 Linux/ARM 构建和运行 Go 插件?