EF - 尝试添加新对象而不是使用现有对象?

时间:2011-01-13 10:56:24

标签: c# asp.net-mvc entity-framework

当我尝试通过在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;
    }
}

2 个答案:

答案 0 :(得分:0)

如果要修改现有对象,则无需再次添加到上下文。因此,只需删除此行以进行更新:

ObjectSet.Add(@case);

您可能需要考虑创建两个单独的方法,即CaseRepository类中的Add和Update。

答案 1 :(得分:0)

忘记在POCO类虚拟中制作2个映射。