Я обновил свою реализацию 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; }
}