Удаление исключений с использованием Entity Framework (C #) - PullRequest
0 голосов
/ 12 февраля 2010

У меня проблема с некоторым простым кодом, я реорганизую некоторый существующий код из LINQ в SQL в Entity Framework. Я тестирую свои сохранения и удаления, и удаление действительно вызывает у меня проблемы:

[TestMethod]
public void TestSaveDelete()
{
    ObjectFactory.Initialize(x =>
    {
        x.For<IArticleCommentRepository>().Use<ArticleCommentRepository>();
    });

    PLArticleComment plac = new PLArticleComment();
    plac.Created = DateTime.Now;
    plac.Email = "myemail";
    plac.Name = "myName";
    plac.Text = "myText";
    plac.Title = "myTitle";

    IArticleCommentRepository acrep = ObjectFactory.GetInstance<IArticleCommentRepository>();
    try
    {
        PortalLandEntities ple = new PortalLandEntities();
        int count = ple.PLArticleComment.Count();
        acrep.Save(plac);
        Assert.AreEqual(ple.PLArticleComment.Count(), count + 1);
        //PLArticleComment newPlac = ple.PLArticleComment.First(m => m.Id == plac.Id);
        //ple.Attach(newPlac);
        acrep.Delete(plac);
        Assert.AreEqual(ple.PLArticleComment.Count(), count + 1);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Каждый раз, когда я пытаюсь запустить этот код, я получаю исключение в операторе delete, сообщая, что он не содержится в текущем ObjectStateManager. Обратите внимание, что и мои сохранения, и удаление выглядят так:

public void Delete(PLCore.Model.PLArticleComment comment)
{
    using (PortalLandEntities ple = Connection.GetEntityConnection())
    {
        ple.DeleteObject(comment);
        ple.SaveChanges();
    }
}

public void Save(PLCore.Model.PLArticleComment comment)
{
    using (PortalLandEntities ple = Connection.GetEntityConnection())
    {
        ple.AddToPLArticleComment(comment);
        ple.SaveChanges();
    }
}

и связь вещь:

public class Connection
{
    public static PortalLandEntities GetEntityConnection()
    {
        return new PortalLandEntities();
    }
}

Любые идеи о том, что я мог бы сделать, чтобы это работало?

1 Ответ

1 голос
/ 12 февраля 2010

Вы не можете загрузить сущность из одного ObjectContext (в вашем случае ObjectContext является экземпляром PortalLandEntities), а затем удалить его из другого ObjectContext, если вы не отсоедините его от первого и не прикрепите ко второму. Ваша жизнь будет намного, намного проще, если вы будете использовать только один ObjectContext за раз. Если вы не можете этого сделать, вы должны вручную отсоединить , а затем сначала присоединить , все время отслеживая, какие сущности подключены к какой ObjectContext.

Как использовать DI с вашим Connection: сделать его нестатичным.

public class Connection
{
    private PortalLandEntities _entities;

    public PortalLandEntities GetEntityConnection()
    {
        return _entities;
    }

    public Connection(PortalLandEntities entities)
    {
        this._entities = entities;
    }
}

Затем используйте DI-контейнер для каждого запроса. Большинство людей делают это через фабрику контроллеров.

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