gpt4 book ai didi

ef-code-first - 如何使 dbContext ExecuteSqlCommand 与新的未提交实体一起工作

转载 作者:行者123 更新时间:2023-12-04 02:22:30 25 4
gpt4 key购买 nike

有没有办法让 ExecuteSqlCommand 与新的未提交实体一起工作。

        using (var context = new EarthContext())
{
var country = new Country(){
Id = "ZZZ",
IsoCodeAlpha2 = "ZZ",
IsoCodeNumberic = 999
};

context.Countries.Add(country);

context.Database.ExecuteSqlCommand(
@"
INSERT INTO dbo.Location([Line1],[CountryId])
VALUES ('random line','ZZZ')
");

context.SaveChanges();
}

它给出了“INSERT 语句与 FOREIGN KEY 约束冲突”异常,因为 ExecuteSqlCommand 在提交新实体之前执行。

*代码必须在一个事务中运行,即我不能在 ExecuteSqlCommand 之前提交更改

最佳答案

据我所知,所有使用 context.Database.ExecuteSqlCommand 调用的 sql 查询都在与“常见”上下文操作不同的事务上执行。另一点是 ExecuteSqlCommand 会立即被调用,所有操作如 context.Countries.Add(country);(所有插入、更新或删除)都使用 context.SaveChanges();.

你应该试试:

using (var context = new EarthContext())
{
var country = new Country(){
Id = "ZZZ",
IsoCodeAlpha2 = "ZZ",
IsoCodeNumberic = 999
};

context.Countries.Add(country);
context.SaveChanges(); // to commit country insertion

context.Database.ExecuteSqlCommand(
@"
INSERT INTO dbo.Location([Line1],[CountryId])
VALUES ('random line','ZZZ')
");
}

但如果你必须满足那些要求

Code must run in one transaction i.e. I cannot commit changes before the ExecuteSqlCommand

您应该避免混合使用 SQL 语句和类似 EF 的代码。

在那种情况下(我假设你已经正确定义了所有 FK)你应该能够这样做:

using (var context = new EarthContext())
{
var country = new Country(){
Id = "ZZZ",
IsoCodeAlpha2 = "ZZ",
IsoCodeNumberic = 999
};

context.Countries.Add(country);
country.Locations.Add(new Location() { Line1 = "random line" } );

context.SaveChanges();
}

关于ef-code-first - 如何使 dbContext ExecuteSqlCommand 与新的未提交实体一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com