EF 4 EDMX до 6 Обновление. Проблема с SaveChanges для новой записи - PullRequest
0 голосов
/ 06 января 2020

Я обновил свою реализацию EF 4 EDMX до EF 6. Следовал всем указаниям SO & MSDN, и теперь я генерирую все модели на основе шаблона генерации кода T4.

Все работает так, как и должно быть, только с одним исключением. Для одного из модулей, когда создается новая сущность, метод _objectContext.SaveChanges(); контекста объекта не создает новую запись в базе данных. Также не выкидывает никаких ошибок.

Мы использовали шаблон «Единица работы». В этом же контексте я обновляю дату последнего изменения других таблиц и кучу других обновлений. Я вижу, это правильно отражено.

Когда я пытаюсь отследить сгенерированные SQL запросы с

_objectContext.InterceptionContext.DbContexts.FirstOrDefault().Database.Log = x => System.Diagnostics.Debug.WriteLine(x);

, я вижу все операторы обновления SQL. Но я не вижу Вставить в систему для модели, которую я создал. Я пытался удалить и заново добавить таблицу в EF, но это не помогло. Что мне здесь не хватает? Как я могу отладить, чтобы найти фактическую причину?

Редактировать: Добавление кода

public partial class ProjectNameContext : DbContext
{
    public ProjectNameContext()
        : base("name=ProjectNameContext")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    .......
    public virtual DbSet<Employee> Employees { get; set; }
}


public class EntityFrameworkObjectContextAdapter : IObjectContext
{
    private readonly ObjectContext _objectContext;

    public EntityFrameworkObjectContextAdapter(ProjectNameContext context)
    {
        _objectContext = ((IObjectContextAdapter)context).ObjectContext;
        //_objectContext.SavingChanges += new EventHandler(objContext_SavingChanges);
    }

    public void Dispose()
    {
        _objectContext.Dispose();
    }
    public void SaveChanges()
    {
        _objectContext.InterceptionContext.DbContexts.FirstOrDefault().Database.Log = x => System.Diagnostics.Debug.WriteLine(x);
        _objectContext.SaveChanges();
    }

    public IObjectSet<T> CreateObjectSet<T>() where T : class

    {
        return _objectContext.CreateObjectSet<T>();
    }

    public void Delete(object entity)
    {
        _objectContext.DeleteObject(entity);
    }

    public DbConnection GetConnection()
    {
        return _objectContext.Connection;
    }

    public ObjectContext Context()
    {
        return _objectContext;
    }

}


public class ProjectEntityContextFactory : IContextFactory
{
    #region IContextFactory Members


    public IObjectContext Build()
    {
        EntityFrameworkObjectContextAdapter entityFrameworkObjectContextAdapter = new EntityFrameworkObjectContextAdapter(new EntegraContext());
        entityFrameworkObjectContextAdapter.Context().CommandTimeout = 180;
        return entityFrameworkObjectContextAdapter;

    }

    #endregion
}

Приведенный выше код взят из общей реализации. Ниже приведен код создания нового сотрудника. Оператор commit из приведенного ниже кода выполняет SaveChanges() метод класса EntityFrameworkObjectContextAdapter, упомянутого выше.

public void CreateEmployee(ICreateEmployeeCommand command)
{
    using (UnitOfWork unitOfWork = new UnitOfWork(ContextFactory))
    {
        _deptDao.UnitOfWork = unitOfWork;

        Department dept = _deptDao.Get(command.DepartmentId);

        //Code below creates new employee object & assigns all the properties 
        // eg. Name Address Department from command object
        Employee emp = GetNewEmployeeObject(command, dept);

        //Code below calls SaveChanges method from EntityFrameworkObjectContextAdapter above
        unitOfWork.Commit();
    }
}

& Entity:

public partial class Employee
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Employee()
    {

    }

    public string Name { get; set; }
    public string Designation { get; set; }
......
    public virtual Department Department { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...