如何获取 EF Code First DbContext 事务行标识?

发布于 2025-01-03 06:05:06 字数 1121 浏览 2 评论 0原文

是否可以在 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();
}

Is it possible to get the identity of a record after the SaveChanges method but prior to the TransactionScope.Complete call using the DbContext? Do we need to cast to ObjectContext to get this functionality?

We need this when we send a message to a transactional queue on a separate server using MSDTC.

Example:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我早已燃尽 2025-01-10 06:05:07

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

The identity value should always be set after you call SaveChanges, even inside a TransactionScope.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文