从另一个DataContext加载?

时间:2012-03-20 13:33:52

标签: c# winforms linq-to-sql datacontext

在我以前的应用程序中,当我使用linq-to-sql时,我总是使用一个类来放入我的linq-to-sql代码,所以我只有一个DataContext

我当前的应用程序虽然变得太大了,但我开始将我的代码分成不同的类(一个用于客户,一个用于位置,一个用于供应商......)并且它们都有自己的DataContext DatabaseDesignDataContext dc = new DatabaseDesignDataContext(); < / p>

现在,当我尝试保存某个位置的联系人(我从另一个DataContext获取)时,我收到以下错误:

  

“已尝试附加或添加非新的实体,可能已从另一个DataContext加载。这不受支持。”

我认为这是因为我为每个班级创建了一个DataContext,但我不知道这有何不同?

我正在寻找任何想法,谢谢。

我的课程如下所示:

 public class LocatieManagement
{
    private static DatabaseDesignDataContext dc = new DatabaseDesignDataContext();

    public static void addLocatie(locatie nieuweLocatie)
    {
        dc.locaties.InsertOnSubmit(nieuweLocatie);
        dc.SubmitChanges();
    }

    public static IEnumerable<locatie> getLocaties()
    {
        var query = (from l in dc.locaties
                     select l);
        IEnumerable<locatie> locaties = query;

        return locaties;
    }

    public static locatie getLocatie(int locatie_id)
    {
        var query = (from l in dc.locaties
                     where l.locatie_id == locatie_id
                     select l).Single();

        locatie locatie = query;
        return locatie;

    }
}

4 个答案:

答案 0 :(得分:2)

如果实体仍附加到原始datacontext,则会发生这种情况。关闭延迟加载(dc.DeferredLoadingEnabled = false):

partial class SomeDataContext
{
    partial void OnCreated()
    {
        this.DeferredLoadingEnabled = false;
    }
}

您可能还需要序列化/反序列化一次(例如,使用datacontractserializer)将其与原始DC断开连接,这是使用datacontractserializer的克隆方法:

internal static T CloneEntity<T>(T originalEntity) where T : someentitybaseclass
{
    Type entityType = typeof(T);

    DataContractSerializer ser =
        new DataContractSerializer(entityType);

    using (MemoryStream ms = new MemoryStream())
    {
        ser.WriteObject(ms, originalEntity);
        ms.Position = 0;
        return (T)ser.ReadObject(ms);
    }
}

答案 1 :(得分:1)

这是因为您尝试管理来自不同上下文的数据 - 您需要正确分离并附加您的对象才能继续 - 但是,我建议您不要这样做。

所以,首先要做的事情是:从实体类中删除数据上下文实例

从这里创建“操作”类,公开CRUD以及使用该特定类型的实体类的内容,每个函数使用该工作单元的专用数据上下文,可能重载到接受工作单元何时需要后续操作的当前上下文。

答案 2 :(得分:0)

我知道每个人都可能厌倦了这一点,但你真的应该考虑使用存储库进行数据访问(并使用工作单元模式来确保共享一个工作单元的所有存储库都使用相同的存储库DataContext的)。

您可以在这里阅读如何做事:Revisiting the Repository and Unit of Work Patterns with Entity Framework(相同的概念也适用于LINQ to SQL)。

答案 3 :(得分:-2)

我发现的另一个解决方案是创建一个父类DataContext

public class DataContext
{
    public static DatabaseDesignDataContext dc = new DatabaseDesignDataContext();
}

让我所有其他类继承这一个。

 public class LocatieManagement : DataContext
 {
        public static void addLocatie(locatie nieuweLocatie)
        {
            dc.locaties.InsertOnSubmit(nieuweLocatie);
            dc.SubmitChanges();
        }
 }

然后所有类都使用相同的DataContext。