Vorbereiten für mehrere EF-Kontexte in einer Arbeitseinheit - TransactionScope

Ich denke über die Möglichkeiten nach, eine einzelne Arbeitseinheit für den Umgang mit mehreren Datenquellen zu implementieren - das Entity Framework. Ich habe einen vorläufigen Ansatz gefunden - für den Moment, in dem ich mich mit einem einzelnen Kontext befasse -, aber es ist anscheinend keine gute Idee.

Wenn wir den folgenden Code analysieren würden, würden Sie ihn für eine schlechte Implementierung halten? Ist die Laufzeit der Transaktion ein potenzielles Problem?

Wenn wir den Transaktionsumfang mit verschiedenen Kontexten umschließen, werden wir natürlich abgedeckt, wenn der zweite Kontext fehlschlägt. SaveChanges () ist fehlgeschlagen ...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Transactions;

    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                using(UnitOfWork unitOfWork = new UnitOfWork())
                {

                    var repository = new EmployeeRepository(unitOfWork);

                    var employee = repository.CreateOrGetEmployee("Whatever Name");

                    Console.Write(employee.Id);

                    unitOfWork.SaveChanges();
                }
            }
        }

        class UnitOfWork : IDisposable
        {
            TestEntities _context;
            TransactionScope _scope;
            public UnitOfWork()
            {
                _scope = new TransactionScope();
                _context = new TestEntities();
            }

            public void SaveChanges()
            {
                _context.SaveChanges();
                _scope.Complete();
            }

            public TestEntities Context
            {
                get
                {
                    return _context;
                }
            }

            public void Dispose()
            {
                _scope.Dispose();
                _context.Dispose();
            }
        }

        class EmployeeRepository
        {
            UnitOfWork _unitOfWork;

            public EmployeeRepository(UnitOfWork unitOfWork)
            {
                _unitOfWork = unitOfWork;
            }

            public Employee GetEmployeeById(int employeeId)
            {
                return _unitOfWork.Context.Employees.SingleOrDefault(e => e.Id == employeeId);
            }

            public Employee CreateEmployee(string fullName)
            {
                Employee employee = new Employee();
                employee.FullName = fullName;
                _unitOfWork.Context.SaveChanges();
                return employee;
            }

            public Employee CreateOrGetEmployee(string fullName)
            {
                var employee = _unitOfWork.Context.Employees.FirstOrDefault(e => e.FullName == fullName);
                if (employee == null)
                {
                    employee = new Employee();
                    employee.FullName = fullName;
                    this.AddEmployee(employee);
                }
                return employee;
            }

            public Employee AddEmployee(Employee employee)
            {
                _unitOfWork.Context.Employees.AddObject(employee);
                _unitOfWork.Context.SaveChanges();
                return employee;
            }
        }
    }

Antworten auf die Frage(1)

Ihre Antwort auf die Frage