2011-01-13 64 views
0

当我尝试通过使用CaseRepository.cs中的bool方法添加一个案例时,通过将用户分配给case对象来确定哪个用户是案例的所有者(谁创建它?),但是当我尝试添加案例时分配它然后它试图添加一个新的用户对象的表,虽然它是一个现有的用户我传入参数?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:// weblogs中描述的类似的类。 asp.net/dwahlin/archive/2012/03/04/new-pluralsight-course-building-asp-net-mvc-apps-with-ef-code-first-html5-and-jquery.aspx – 2012-05-13 01:00:45

回答

0

忘了在POCO类中虚拟出2个我的映射。

0

如果要修改现有的对象,那么你就不要不需要再次添加到上下文中。因此只需删除此行以进行更新:

ObjectSet.Add(@case);

您可能需要考虑创建两个单独的方法,即在CaseRepository类中添加和更新。

+0

你可能得到了它错了。我想要让用户创建一个案例,然后将该案例添加到该用户。 – ebb 2011-01-13 11:06:17

相关问题