Как получить идентификатор строки EF Code First DbContext Transaction? - PullRequest
2 голосов
/ 07 февраля 2012

Можно ли получить идентификатор записи после метода SaveChanges, но до вызова TransactionScope.Complete с использованием DbContext?Нужно ли нам приводить к 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();
}

1 Ответ

2 голосов
/ 07 февраля 2012

Значение идентификатора всегда следует устанавливать после вызова SaveChanges, даже внутри TransactionScope.

...