开发者

Exception deleting using Entity Framework (C#)

I have a problem with some simple code, I'm refactoring some existing code 开发者_开发问答from LINQ to SQL to the Entity Framework. I'm testing my saves and deletes, and the delete is really bugging me:

[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);
    }
}

Every time i try to run this code, I get an exception in the delete statement, telling me that its not contained within the current ObjectStateManager.Please note that both my Save and delete looks like this:

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();
    }
}

and the connection thingy:

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

Any ideas on what i could do to make it work?


You cannot load an entity from one ObjectContext (in your case, an ObjectContext is an instance of PortalLandEntities) and then delete it from another ObjectContext, unless you detach it from the first and attach it to the second. Your life will be much, much simpler if you use only one ObjectContext at a time. If you cannot do that, you must manually Detach and then Attach first, all the while keeping track of which entities are connected to which ObjectContext.

How to use DI with your Connection : make it non-static.

public class Connection
{
    private PortalLandEntities _entities;

    public PortalLandEntities GetEntityConnection()
    {
        return _entities;
    }

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

Then use a DI container per request. Most people do this via a controller factory.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜