Новый объект, не входящий в базу данных

#c# #entity-framework #entity-framework-5 #repository-pattern

#c# #entity-framework #entity-framework-5 #репозиторий-шаблон

Вопрос:

Я использую шаблон репозитория с entity framework 5. Когда я добавляю нового пользователя в свою сущность users, он не сохраняется в базе данных. Есть идеи, почему??

У меня следующая структура —

DAL (содержит модель Entity Framework) -> Ядро -> Веб

Form1.cs

 UserService _userService = new UserService();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        listBox1.DataSource = _userService.GetUserList(10, 1).Users;
        listBox1.DisplayMember = "FullName";
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        UserModel newUser = new UserModel();
        newUser.Username = tbUsername.Text;
        newUser.FirstName = tbFirstname.Text;
        newUser.Surname = tbLastname.Text;
        newUser.Password = tbPassword.Text;
        newUser.LoginEnabled = true;
        newUser.UserStatus = UserStatus.Active;

        _userService.Add(newUser);
    }
  

UserService.cs

 public void Add(UserModel entity)
    {
        User newUser = new User();
        newUser.DateCreated = DateTime.Now;

        AutoMapper.Mapper.CreateMap<UserModel, User>();

        try
        {
            _userRepository.Add(AutoMapper.Mapper.Map(entity, newUser));
        }
        catch (Exception ex)
        {

        }
    }
  

RepositoryBase.cs

 public abstract class RepositoryBase<T> : IRepository<T>
    where T : class
{
    public RepositoryBase()
        : this(new AcRepositoryContext())
    {
    }

    public RepositoryBase(IRepositoryContext repositoryContext)
    {
        repositoryContext = repositoryContext ?? new AcRepositoryContext();
        _objectSet = repositoryContext.GetObjectSet<T>();
    }

    private IObjectSet<T> _objectSet;
    public IObjectSet<T> ObjectSet
    {
        get
        {
            return _objectSet;
        }
    }

    #region IRepository Members

    public void Add(T entity)
    {
        this.ObjectSet.AddObject(entity);
    }

    public void Delete(T entity)
    {
        this.ObjectSet.DeleteObject(entity);
    }

    public IList<T> GetAll()
    {
        return this.ObjectSet.ToList<T>();
    }

    public IList<T> GetAll(Expression<Func<T, bool>> whereCondition)
    {
        return this.ObjectSet.Where(whereCondition).ToList<T>();
    }

    public T GetSingle(Expression<Func<T, bool>> whereCondition)
    {
        return this.ObjectSet.Where(whereCondition).FirstOrDefault<T>();
    }

    public void Attach(T entity)
    {
        this.ObjectSet.Attach(entity);
    }

    public IQueryable<T> GetQueryable()
    {
        return this.ObjectSet.AsQueryable<T>();
    }

    public long Count()
    {
        return this.ObjectSet.LongCount<T>();
    }

    public long Count(Expression<Func<T, bool>> whereCondition)
    {
        return this.ObjectSet.Where(whereCondition).LongCount<T>();
    }

    #endregion

}
  

AcRepositoryContext.cs

 public class AcRepositoryContext : IRepositoryContext
{
    private const string OBJECT_CONTEXT_KEY = "AC.DAL.AccessControlDBEntities";
    public IObjectSet<T> GetObjectSet<T>()
        where T : class
    {
        try
        {
            return ContextManager.GetObjectContext(OBJECT_CONTEXT_KEY).CreateObjectSet<T>();
        }
        catch (Exception)
        {

            throw;
        }

    }

    /// <summary>
    /// Returns the active object context
    /// </summary>
    public ObjectContext ObjectContext
    {
        get
        {
            return ContextManager.GetObjectContext(OBJECT_CONTEXT_KEY);
        }
    }

    public int SaveChanges()
    {
        return this.ObjectContext.SaveChanges();
    }

    public void Terminate()
    {
        ContextManager.SetRepositoryContext(null, OBJECT_CONTEXT_KEY);
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Door> Doors { get; set; }
    public DbSet<Event> Events { get; set; }
}
  

Ответ №1:

В вашем классе реализации репозитория ( RepositoryBase или его дочерних элементах) у вас должен быть вызов контекста SaveChanges .

Например, в RepositoryBase<T> , я бы добавил этот метод:

 public void Commit()
{
   repositoryContext.SaveChanges()
}
  

После выполнения вызова Add() в вашем btnAdd_Click обработчике событий вы должны вызвать этот Commit метод для сохранения изменений в базе данных.

Для получения дополнительной информации загляните в этот блог:

Использование шаблона репозитория в Entity Framework

Надеюсь, это поможет!

Комментарии:

1. Я добавил в сообщение файл AcRepositoryContext.cs. Кажется, я не могу получить доступ к какому-либо методу SaveChanges() из репозитория <T> ?

2. Ну, сохранение должно происходить через ваш контекстный класс репозитория, который, насколько я вижу, доступен только в вашем классе RepositoryBase. Отсюда и мое предложение. Однако вы лучше знаете свою иерархию объектов и наследование, поэтому, пожалуйста, используйте свое лучшее суждение, чтобы поместить его в подходящее место. 🙂

Ответ №2:

Я не вижу в вашем репозитории, где вы вызываете SaveChanges в вашем AcRepositoryContext Я предполагаю, что это наследуется от dbcontext или, что более вероятно, от вашего соглашения об именовании objectcontext

Итак, после того, как вы добавили новую сущность, обновили или удалили, вам нужно сохранить изменения, чтобы эти изменения сохранялись в базе данных.

Я вижу в вашем классе userservice, где вы добавляете сущность в репозиторий, но, похоже, впоследствии вы не вызываете SaveChanges в контексте.