有没有办法让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
之前提交更改答案 0 :(得分:2)
据我所知,所有使用context.Database.ExecuteSqlCommand
调用的sql查询都是在与#34; common"上下文操作。另一点是立即调用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')
");
}
但是如果你必须满足这些要求
代码必须在一个事务中运行,即我无法在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();
}