0

子テーブルを持つテーブルに情報を追加する方法について議論しようとしています。ユーザーを初期化するとき、ユーザーはパスワードを暗号化し、データを子クラスに挿入する必要があります。私はリポジトリ、作業単位のパターンに完全に精通していないので、最初からこれを適切に行うようにしたいと考えています。ありがとう!

私のテーブルは次のとおりです。

ユーザー、ユーザーロール

私のコード:

[HttpPost]
    public ActionResult AddUser(User user)
    {
        try
        {
            if (ModelState.IsValid)
            {
                uow.UserRepository.Insert(user);
                uow.Save();
                return RedirectToAction("Index", "User");
            } 
        }
        catch (DataException)
        {
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
        }
        return View(user);

    }

public class UserRepository : IUserRepository, IDisposable
{
    private StudentSchedulingEntities _context;

    public UserRepository(StudentSchedulingEntities context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        _context = context;
    }
    public IEnumerable<User> GetUsers()
    {
        return _context.Users.ToList();
    }
    public User GetUserByID(int id)
    {
        return _context.Users.Find(id);

    }
    public void InsertStudent(User user)
    {
        _context.Users.Add(user);
    }
    public void DeleteStudent(int userID)
    {
        User usr = _context.Users.Find(userID);
        _context.Users.Remove(usr);
    }
    public void UpdateStudent(User user)
    {
        _context.Entry(user).State = EntityState.Modified;
    }
    public void Save() {
        _context.SaveChanges();
    }
    public void Dispose()
    {
        Dispose(true); 
        GC.SuppressFinalize(this); 
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_context != null)
            {
                _context.Dispose();
                _context = null;
            }
        }
    }
}

 public interface IUserRepository : IDisposable
{
    IEnumerable<User> GetUsers();
    User GetUserByID(int userID);
    void InsertStudent(User user);
    void DeleteStudent(int userID);
    void UpdateStudent(User user);
    void Save();
}

public class UnitOfWork : IDisposable
{
    private StudentSchedulingEntities _context = new StudentSchedulingEntities();
    private GenericRepository<User> userRepository;

    public GenericRepository<User> UserRepository
    {
        get
        {

            if (this.userRepository == null)
            {
                this.userRepository = new GenericRepository<User>(_context);
            }
            return userRepository;
        }
    }        

    public void Save()
    {
        _context.SaveChanges();
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                _context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

コメントから更新:

[HttpPost]
    public ActionResult AddUser(AddUserViewModel auvm)
    {
        try
        {
            if (ModelState.IsValid)
            {
                uow.UserRoleRepository.Insert(auvm.UserRole);
                uow.UserRepository.Insert(auvm.User);

                uow.Save();
                return RedirectToAction("Index", "User");
            } 
        }
        catch (DataException)
        {
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
        }
        return View(auvm);

    }

public class AddUserViewModel 
{
    public User User { get; set; }
    public UserRole UserRole { get; set; }
    public UserRoleType UserRoleType { get; set; }
    public IEnumerable<SelectListItem> UserRoleTypes { get; set; }      
}
4

1 に答える 1

0

新しいUserオブジェクトを作成するだけです。UserRolesをユーザーに割り当てます。ユーザーオブジェクトを保存します。コンテキストクラスは作業の単位として機能します。[変更の保存]を呼び出した場合にのみ、すべてが保存されます。

  1. 新しいユーザーを作成する
  2. ユーザーに役割を追加します(必要な場合)
  3. リポジトリInsertStudentを呼び出す
  4. 上記のコードは、役割を除いてこれを実行しているようですが、これまでのところ、私には問題ないようです。

ユーザークラスに非常によく似たUserCreateViewModelを投稿するように、ViewModelルート(推奨)を選択する人もいます。このようにして、ユーザークラスが変更された場合、またはすべてをユーザーに公開したくない場合は、これらのケースをより簡単に処理できます。

于 2012-05-09T18:27:52.790 に答える