【问题标题】:How to get EF Code First DbContext Transaction row identity?如何获取 EF Code First DbContext Transaction 行标识?
【发布时间】:2012-02-06 23:19:24
【问题描述】:

是否可以在 SaveChanges 方法之后但在使用 DbContext 调用 TransactionScope.Complete 之前获取记录的标识?我们是否需要强制转换为 ObjectContext 才能获得此功能?

当我们使用 MSDTC 将消息发送到单独服务器上的事务队列时,我们需要它。

例子:

static void Main(string[] args)
{
    const string qName = ".\\Private$\\DbContextTransactions";
    var db = new BlogDb();

    // force db creation & create queue
    Console.WriteLine("Count={0}", db.Posts.Count());
    if (!MessageQueue.Exists(qName))
        MessageQueue.Create(qName, true); // transactional

    try
    {
        using (var t = new TransactionScope())
        using (MessageQueue q = new MessageQueue(qName))
        {
            var post = new Post() { Title = "Test " + DateTime.Now.Ticks.ToString() };
            db.Posts.Add(post);
            db.SaveChanges();

            // TODO: how do we get post.Id (updated identity)?

            q.Send(post.Id, MessageQueueTransactionType.Automatic);
            t.Complete();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

    Console.WriteLine("Count={0}", db.Posts.Count());
    Console.ReadLine();
}

【问题讨论】:

  • 调用SaveChanges后,您的 post.Id 应填写数据库中的正确身份。
  • 我们在连接字符串中发现了“enlist=false”,这导致我们的事务无法登记。

标签: entity-framework transactions ef-code-first transactionscope


【解决方案1】:

应始终在调用 SaveChanges 之后设置标识值,即使在 TransactionScope 内也是如此。

【讨论】:

  • 这不是我们在 4.2 和 4.3 中看到的
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2011-10-26
  • 2023-04-03
相关资源
最近更新 更多