【问题标题】:Entity Framework 4 - Delete Object实体框架 4 - 删除对象
【发布时间】:2011-02-18 09:15:22
【问题描述】:

我的数据库中有 3 个表

CmsMasterPages
CmsMasterPagesAdvSlots (Pure Juction Table)
CmsAdvSlots

这是我的 EDM 的图片:

我需要找出与 CmsMasterPage 连接的所有对象 CmsAdvSlot(它在我发布的代码中工作), 并 DELETE 来自数据库的结果 (CmsAdvSlot)。

当我找到主题时,我的问题是我无法删除此对象。

Error: The object cannot be deleted because it was not found in the ObjectStateManager. 

        int findMasterPageId = Convert.ToInt32(uxMasterPagesListSelector.SelectedValue);
        CmsMasterPage myMasterPage = context.CmsMasterPages.FirstOrDefault(x => x.MasterPageId == findMasterPageId);
        var resultAdvSlots = myMasterPage.CmsAdvSlots;
        // It is working until here
        foreach (var toDeleteAdv in resultAdvSlots)
        {
            context.DeleteObject(myMasterPage.CmsAdvSlots.Any()); // ERORR HERE!!
            context.SaveChanges();
        }

知道如何解决吗?谢谢你的时间! :-)

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    while (myMasterPage.CmsAdvSlots.Count > 0)
    {
      var slot = myMasterPage.CmsAdvSlots.First();
      myMasterPage.CmsAdvSlots.Remove(slot); // This is required only in some scenarios - it depends on type of entities you are using.
      context.DeleteObject(slot);
    }
    
    context.SaveChanges();
    

    【讨论】:

    • 嗨,我试过了,但我收到一个错误:错误 1 ​​无法使用 [] 将索引应用到类型为 'System.Data.Objects.DataClasses.EntityCollection 的表达式'
    • @GlbboK:好的,我修改了示例。
    • 现在另一个错误:无法更新 EntitySet 'CmsMasterPagesAdvSlots',因为它有一个 DefiningQuery 并且 元素中不存在 元素来支持当前操作......
    • @GlbboK:您的映射有问题。它说联结表 CmsMasterPagesAdvSlots(表示 M:N 关系的表)是由 DefiningQuery 定义的 - 如果您使用数据库视图而不是表,或者如果您的表由于缺少主键而只读,通常会发生这种情况。
    • 我的表 CmsMasterPagesAdvSlots 是一个没有主键的多对多连接表。你知道如何解决它吗?谢谢
    【解决方案2】:

    context.DeleteObject(myMasterPage.CmsAdvSlots.Any());
    myMasterPage.CmsAdvSlots.Any() 应该返回一个布尔值 您应该尝试改用myMasterPage.CmsAdvSlots.First()!

    【讨论】:

    • 嗨,我现在收到另一个错误:无法更新 EntitySet 'CmsMasterPagesAdvSlots',因为它有一个 DefiningQuery 并且 元素中不存在 元素来支持当前操作。"}有什么想法吗?
    • @GIbboK:这些实体是否与下面的数据库视图相关联?
    • 您好,这些对象位于数据库 CmsMasterPagesAdvSlots 中,但您可以使用导航属性访问这些对象。希望我能够回答您的问题。
    【解决方案3】:

    .Any() 返回一个布尔值。请改用.First(),.First() 在您的情况下将返回第一个CmsAdvSlot。

    如果你想删除所有CmsAdvSlot,我会按照@Ladislav Mrnka 的例子。

    【讨论】:

    • 嗨 Filip,现在我在下一行出现错误“无法更新 EntitySet 'CmsMasterPagesAdvSlots',因为它有一个 DefiningQuery 并且 元素中不存在 元素来支持当前操作。"}有什么想法吗?
    • @GlbboK:所以您正在使用只读实体。这些实体是否映射到数据库视图?
    • 抱歉,我不明白您关于 DB View 的问题?无论如何,我需要删除的这些对象都可以使用导航属性访问。有任何想法吗?谢谢
    • 对于 Filip,我再次尝试了您的代码,但现在我收到另一个错误:集合已修改;枚举操作可能无法执行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多