我正在使用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文件中导出对象的功能,并将它们与数据库中可用的数据进行比较。当我的构造函数接受Xtensive.Orm.Session
的1个参数时,我按照后面的方式导入对象并返回包含所有导入对象的列表。
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框架,但我必须使用它。我希望你们中的一些人可以帮助我解决这个恼人的问题,因为他们的支持已经死了。
答案 0 :(得分: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之类的东西