0

我正在使用 DataObjects.NET 在 C# 中创建一个 WinForms 应用程序。我有点卡在某个点上。我在数据库中有一些数据。对象如下:

[HierarchyRoot]
[Index("Id", Unique = true)]
public class Object : Entity
{
    [Field]
    public string Id { get; set; }
    [Field(Length = 100)]
    public string Value { get; set; }

    public Object(Session session)
        : base(session)
    {
    }

    public Object(Session session,string Id,string Value)
        : base(session)
    {
       //...
    }
}

现在我需要从 CSV 文件中导入对象并将它们与数据库中可用的数据进行比较的功能。由于我的构造函数采用 1 个参数Xtensive.Orm.Session,因此我按以下方式导入对象并返回包含所有导入对象的列表。

 while ((sLine = sr.ReadLine()) != null)
 {
        //Object o = new Object(Xtensive.Orm.Session,string id, string value)
        Object o = new Object(session, sLine.Split(';')[0], sLine.Split(';')[1]);

        objectlist.Add(o);
 }
 return objectlist;

获得导入列表后,我对数据进行了一些检查并分析数据以填充 2 个新列表,其中包含已更改的对象和新对象。现在我的问题是,如果用户单击保存按钮,则必须在数据库中更新或添加新对象和更改的对象。我尝试使用Session.SaveChanges();,但由于我的所有对象都继承自Entity,因此会话希望保存所有导致重复行出现 SQL 错误的对象。我不知道如何解决这个问题。

 private bool SaveChanges()
 {
      foreach(Object o in newObjects)
           //Add new objects to db
      foreach(Object o in changedObjects)
           //Update object
 }

我在万维网上寻找解决方案,但找不到一个很好解释的解决方案。

我是 DataObjects 的新手,我知道它是一个旧的 ORM 框架,但我必须使用它。我希望你们中的一些人可以帮助我解决这个烦人的问题,因为他们的支持已经死了。

4

1 回答 1

0

据我了解,DataObjects.Net 没有实现工作单元。相反,它保持连接打开并在您进行更改(创建/更新/删除实例)后立即推送更新。

所以,随着

Object o = new Object(session, sLine.Split(';')[0], sLine.Split(';')[1]);

DataObjects.Net 将记录存储到与该对象对应的 DB。

private bool SaveChanges()
 {
      foreach(Object o in newObjects)
           //Add new objects to db
      foreach(Object o in changedObjects)
           //Update object
 }

你被迫再做一次。因此,您遇到了此错误。

所以正确的解决方案建议 1)检测是否已经存储了一些对象,2)像你一样创建对象(确实需要创建),3)不要调用像 SaveChanges 之类的东西

于 2014-09-05T20:15:54.420 回答