【问题标题】:Temporary Entities with Entity Framework具有实体框架的临时实体
【发布时间】:2009-06-09 12:35:31
【问题描述】:

我有一个名为 Pathway 的实体对象,它与路径表中的数据直接相关。我的数据库还存储了 Pathway 定制的规则。我想做的是在我的代码中创建一个 Pathway 对象,它是 Pathway + PathwayCustomisations 的结果。结果应该永远不会找到返回数据库的方法,它只是代码中使用的临时投影。

public static Pathway ApplyCustomisation(Pathway p, ICollection<PathwayCustomisation> c)
{
    Pathway resultant = new Pathway();
    if (!p.PathwayModule.IsLoaded) p.PathwayModule.Load();
    foreach (PathwayModule m in p.PathwayModule)
    {
        resultant.PathwayModule.Add(m);
    }
    foreach (PathwayCustomisation i in c)
    {
        switch (i.Command)
        {
            case "ADD":
                resultant.PathwayModule.Add(i.PathwayModule);
                break;
            case "DELETE":
                resultant.PathwayModule.Remove(i.PathwayModule);
                break;
        }
    }
    return resultant;
}

此方法在第一个障碍中窒息,因为当 PathwayModule 实体只能属于模型/数据库中的一个时,我将它们添加到第二个 Pathway:

CoursePlanner.Test.PathwayTest.ApplyCustomisation:
System.InvalidOperationException : Collection was modified; enumeration operation may not execute.

有没有办法轻松处理实体投影?我是否正确地解决了这个问题?

编辑:

仅使用方法的第一部分时,我仍然会遇到异常:

public static Pathway ApplyCustomisation(Pathway p, ICollection<PathwayCustomisation> c)
{
    Pathway resultant = new Pathway();
    if (!p.PathwayModule.IsLoaded) p.PathwayModule.Load();
    foreach (PathwayModule m in p.PathwayModule)
    {
        resultant.PathwayModule.Add(m);
    }
    return resultant;
}

上面的枚举并没有修改被枚举的同一个集合,它只是将项目添加到第二个集合中。这段代码给出了同样的异常。

.NET3.5、C#、VS Express 2008

谢谢,

丹尼尔

【问题讨论】:

    标签: c# .net linq entity-framework orm


    【解决方案1】:

    您的异常是由您在枚举集合时修改集合引起的。

    foreach (Item item in collection)
    {
        collection.Add(something); // Not allowed.
        collection.Remove(something); // Not allowed, too.
    }
    

    使用像普通对象这样的实体没有问题 - 您只能避免实体附加到对象上下文(直接或通过相关实体间接)并且它们不会被持久化到数据库中。

    【讨论】:

    • 虽然起初我意识到这是该方法的一个问题,但我仍然得到该方法的第一部分的异常(参见我上面的编辑)。该枚举不会修改被枚举的同一个集合,它只是将项目添加到第二个集合。此代码给出了相同的异常。
    • 在创建新的结果 Pathway 时,我不希望将任何 PathwayModules 与结果永久关联或以任何方式修改任何现有实体及其关系。
    • 我不知道你的模型,但这是否涉及多对多关系?在关系的一端添加一些东西也会改变另一端。
    • 是的,我认为这就是问题所在。一个 PathwayModule 实体不能属于多个 Pathway 实体。我要创建的结果 Pathway 不是实体,但应该像 Pathway 一样。我一定是错误地解决了这个问题......
    猜你喜欢
    • 2021-05-03
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多