EF - Пытается добавить новый объект вместо использования существующего? - PullRequest
0 голосов
/ 13 января 2011

Почему, когда я пытаюсь добавить кейс с помощью метода bool в CaseRepository.cs, назначив пользователя к кейс-объекту, чтобы определить, какой пользователь является владельцем кейса (кто его создал?) - но когда япопытаться назначить его, затем попытаться добавить новый объект User в таблицу, хотя это уже существующий пользователь, которого я передаю в качестве параметра?

Короче говоря: я пытаюсь позволить пользователю создать делои назначьте этот случай пользователю.

Причиной отображения MembershipUser в объекте пользователя является включение 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 голосов
/ 20 января 2011

Забыл сделать 2 из моих отображений в классах POCO виртуальными.

0 голосов
/ 13 января 2011

Если вы изменяете существующий объект, вам не нужно снова добавлять его в контекст.Поэтому просто удалите эту строку для обновлений:

ObjectSet.Add (@case);

Возможно, вам придется рассмотреть возможность создания двух отдельных методов, Add и Update в классе CaseRepository.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...