如何使dbContext ExecuteSqlCommand与新的未提交实体一起使用

时间:2014-11-05 12:47:48

标签: ef-code-first dbcontext

有没有办法让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

之前提交更改

1 个答案:

答案 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();
}