簡體   English   中英

使用實體框架(C#)刪除異常

[英]Exception deleting using Entity Framework (C#)

我對一些簡單的代碼有疑問,我正在重構一些現有的代碼,從LINQ到SQL再到實體框架。 我正在測試保存和刪除,刪除確實困擾着我:

[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中。請注意,我的Save和Delete都看起來像這樣:

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

關於我可以做些什么的任何想法?

您不能從一個ObjectContext加載實體(在您的情況下, ObjectContextPortalLandEntities的實例),然后再從另一個ObjectContext刪除它,除非您將其與第一個分離,然后將其附加到第二個。 如果一次只使用一個ObjectContext ,您的生活將變得非常簡單。 如果無法做到這一點,則必須手動先分離然后再附加 ,同時始終跟蹤哪些實體連接到了哪個ObjectContext

如何在您的Connection使用DI:使其變為非靜態。

public class Connection
{
    private PortalLandEntities _entities;

    public PortalLandEntities GetEntityConnection()
    {
        return _entities;
    }

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

然后根據請求使用DI容器。 大多數人通過控制器工廠來執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM