2011-01-13 6 views
0

CaseRepository.cs에서 bool 메서드를 사용하여 케이스를 추가하려고 할 때 케이스 오브젝트에 사용자를 지정하여 어떤 사용자가 케이스의 소유자 (누가 그것을 만들었습니까?)를 결정하면 어떻게됩니까? -하지만 시도 할 때 그것을 할당하기 위해 테이블에 새로운 User 객체를 추가하려고 시도합니다. 그러나 기존 사용자인데 매개 변수로 전달하고 있습니까?EF - 기존 개체를 사용하는 대신 새 개체를 추가하려고합니까?

요약하면 사용자가 사례를 만들고 해당 사례를 사용자에게 할당하려고합니다.

MembershipUser를 User 개체에 매핑하는 이유는 EF (코드 우선)가 CRUD 작업에이를 사용할 수있게하기 위해서입니다.

// CaseController.cs

[AuthWhere(AuthorizeRole.Developer)] 
[HttpPost] 
public ActionResult Create(CreateCaseViewModel model) 
{ 
    var success = false; 
    string message; 

    User user = Mapper.Map<MembershipUser, User>(_membershipService.GetUserByUserName(User.Identity.Name)); 
    Case createCase = _caseService.CreateCase(model.Topic, model.Message); 

    bool addCase = _caseService.AddCase(createCase, user); 

    if(!addCase) 
    { 
     message = ControllerResources.CaseCreateFail; 
    } 
    else 
    { 
     success = true; 
     message = ControllerResources.CaseCreateSuccess; 
    } 

    return Json(new 
    { 
     Success = success, 
     Message = message, 
     Partial = RenderPartialViewToString("List", GetCases) 
    }); 
} 

// RepositoryBase.cs

public class RepositoryBase<T> : IRepository<T> where T : class 
{ 
    public IDbContext Context { get; private set; } 
    public IDbSet<T> ObjectSet { get; private set; } 

    public RepositoryBase(IDbContext context) 
    { 
     Contract.Requires(context != null); 

     Context = context; 

     if (context != null) 
     { 
      ObjectSet = Context.CreateDbSet<T>(); 

      if (ObjectSet == null) 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 

    [ContractInvariantMethod] 
    private void Invariant() 
    { 
     Contract.Invariant(Context != null); 
     Contract.Invariant(ObjectSet != null); 
    } 

    public IRepository<T> Add(T entity) 
    { 
     ObjectSet.Add(entity); 
     return this; 
    } 

    public IRepository<T> SaveChanges() 
    { 
     Context.SaveChanges(); 
     return this; 
    } 
} 

// CaseRepository.cs

public class CaseRepository : RepositoryBase<Case>, ICaseRepository 
{ 
    public CaseRepository(IDbContext context) 
      : base(context) 
    { 
     Contract.Requires(context != null); 
    } 

    public bool AddCase(Case @case, User user) 
    { 
     @case.User = user; 

     ObjectSet.Add(@case); 
     Context.SaveChanges(); 

     return true; 
    } 
} 
+0

http://www.codeproject.com/Articles/318820/ASP-NET-MVC-3-0-JqGrid-Unit-Of-Work-Repository-EF 및 http : // 웹 로그에 설명 된 것과 유사한 클래스입니다. asp.net/dwahlin/archive/2012/03/04/new-pluralsight-course-building-asp-net-mvc-apps-with-ef-code-first-html5-and-jquery.aspx –

답변

0

가상으로 POCO 클래스에서 2 개의 매핑을 만드는 것을 잊어 버렸습니다.

0

당신이 개체를 기존 수정하는 경우에, 당신 돈 다시 컨텍스트에 추가 할 필요가 없습니다. 따라서 업데이트를 위해 다음 행을 제거하십시오.

ObjectSet.Add (@case);

CaseRepository 클래스에서 추가 및 업데이트라는 두 개의 별도 메서드를 만드는 것이 좋습니다.

+0

그것은 틀렸다. 내가하려는 것은 사용자가 사례를 작성한 다음 해당 사례를 해당 사용자에게 추가하게하는 것입니다. – ebb

+0

죄송합니다. 다음은 사용자의 새 인스턴스를 만드는 것입니다. 사용자 user = Mapper.Map (_ membershipService.GetUserByUserName (User.Identity.Name)); 가장 먼저 datebase에서 인스턴스를 검색하는 것이 가장 좋습니다. – ShahidAzim

+0

예. 전체 아이디어입니다. MembershipUser 객체를 사용하여 User 객체로 만듭니다. 그런 다음 User 객체를 사용하여 어떤 사용자가 "소유"하고 있는지 확인하지만 EF 코드를 먼저 사용하고 User 객체가 필요한 데이터를 가져와야하는 aspnet_Users 테이블에 매핑됩니다. - 따라서 전달 된 User 객체는 aspnet_Users ..에서 가져온 MembershipUser이므로 새 객체가 아니라 사용자 객체입니다. 알았어. (포스트 업데이트) – ebb

관련 문제