powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF DbContext. Куда дели SaveChanges(SaveOption)
3 сообщений из 3, страница 1 из 1
EF DbContext. Куда дели SaveChanges(SaveOption)
    #38102255
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ObjectContext были методы:

Код: c#
1.
2.
3.
SaveChanges(SaveOption)

AcceptAllChanges()



где они или аналоги в DbContext API?
...
Рейтинг: 0 / 0
EF DbContext. Куда дели SaveChanges(SaveOption)
    #38102273
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот случай, высосаный из пальца, в котором может понадобиться. Может в DbContext API это решается по-другому

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ConsoleApplication19
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var ctx1 = new DB1Entities("name=DB1Entities"))
            using (var ctx2 = new DB1Entities("name=DB2Entities"))
            {
                // Пусть мы в пределах одной распределенной транзакции изменяем данные в разных БД
                using (var t = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    ChangeData(ctx1.Abonents.FirstOrDefault());
                    ChangeData(ctx2.Abonents.FirstOrDefault());

                    DumpContextEntries("ctx1 before save:", ctx1);
                    DumpContextEntries("ctx2 before save:", ctx2);

                    // Здесь все в обоих контекстах ObjectStateEntries в состоянии Added, Deleted, Modified и т. п..

                    ctx1.SaveChanges(/* В ObjectContext API  был метод с аргументом SaveOptions. Хочется задать SaveOptions.DetectChangesBeforeSave*/);
                    ctx2.SaveChanges(/* без SaveOptions.AcceptChangesAfterSave */);

                    DumpContextEntries("ctx1 after save:", ctx1);
                    DumpContextEntries("ctx2 after save:", ctx2);

                    // Здесь в обоих контекстах при текущих раскладах ObjectStateEntries в состоянии UNCHANGED
                    // т. е. существует вероятность, что если будет откат транзакции, то контекст останется в
                    // не согласованном состоянии, так как транзакция еще не закоммичена, а сами Entity уже типа закоммичены (сами обьекты вне транзакции, увы).

                    t.Complete();

                    // Здесь только хочется ctx1.AcceptAllChanges()
                    // Здесь только хочется ctx2.AcceptAllChanges()
                }
                        
                // Какой-то код
            }
        }

        private static void ChangeData(Abonent aa)
        {
            if (aa == null)
                throw new ArgumentNullException();

            aa.Name = "qwef";
            aa.Cars.Add(new Car() { Model = "M1 Added", RegNum = "RN Changed" });
        }

        private static void DumpContextEntries(string message, DB1Entities ctx1)
        {
            Debug.WriteLine(message);

            foreach (var e in ctx1.ChangeTracker.Entries())
                Debug.WriteLine(string.Format("{0} - {1}", e.Entity, e.State));
        }
    }
}
...
Рейтинг: 0 / 0
EF DbContext. Куда дели SaveChanges(SaveOption)
    #38102285
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое-то решение нашел. Методом ковыряния в кишках. В любом случае буду рад комментам, уверен это как-то делается более цивилизованно.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;

namespace ConsoleApplication19
{
    class Program
    {
        static void Main(string[] args)
        {
            // Пусть мы в пределах одной распределенной транзакции изменяем данные в разных БД
            using (var ctx1 = new DB1Entities("name=DB1Entities"))
            using (var ctx2 = new DB1Entities("name=DB2Entities"))
            {
                using (var t = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    ChangeData(ctx1.Abonents.FirstOrDefault());
                    ChangeData(ctx2.Abonents.FirstOrDefault());

                    DumpContextEntries("ctx1 before save:", ctx1);
                    DumpContextEntries("ctx2 before save:", ctx2);

                    ((IObjectContextAdapter)ctx1).ObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
                    ((IObjectContextAdapter)ctx2).ObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);

                    DumpContextEntries("ctx1 after save:", ctx1);
                    DumpContextEntries("ctx2 after save:", ctx2);

                    t.Complete();

                    ((IObjectContextAdapter)ctx1).ObjectContext.AcceptAllChanges();
                    ((IObjectContextAdapter)ctx2).ObjectContext.AcceptAllChanges();

                    DumpContextEntries("ctx1 after vommit and AcceptAllChanges:", ctx1);
                    DumpContextEntries("ctx1 after vommit and AcceptAllChanges:", ctx2);
                }
                        
                // Какой-то код
            }
        }

        private static void ChangeData(Abonent aa)
        {
            if (aa == null)
                throw new ArgumentNullException();

            aa.Name = "qwef";
            aa.Cars.Add(new Car() { Model = "M1 Added", RegNum = "RN Changed" });
        }

        private static void DumpContextEntries(string message, DB1Entities ctx1)
        {
            Debug.WriteLine(message);

            foreach (var e in ctx1.ChangeTracker.Entries())
                Debug.WriteLine(string.Format("{0} - {1}", e.Entity, e.State));
        }
    }
}
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF DbContext. Куда дели SaveChanges(SaveOption)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]