当我尝试通过在CaseRepository.cs中使用bool方法添加一个案例时,通过将用户分配给案例对象来确定哪个用户是案例的所有者(谁创建了它?) - 但是当我尝试分配它然后它尝试添加一个新的用户对象到表,虽然它是我作为参数传入的现有用户?
简而言之:我正试图让用户创建案例并将该案例分配给用户。
将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 :(得分:0)
如果要修改现有对象,则无需再次添加到上下文。因此,只需删除此行以进行更新:
ObjectSet.Add(@case);
您可能需要考虑创建两个单独的方法,即CaseRepository类中的Add和Update。
答案 1 :(得分:0)
忘记在POCO类虚拟中制作2个映射。