【发布时间】:2011-04-27 22:51:07
【问题描述】:
我目前正在尝试创建一个使用泛型的类,以减少未来开发所需的工作量。当我将表添加到 LINQ To SQL 设计器时,每一个都使用了某些基本方法。我不想在与每个新表关联的每个部分类中复制它们,而是想使用一个通用类。问题是对实体所做的任何更改都不会被识别,因此不会提交。
Public Partial Class ABC
{
Public Static Bool Synchronize(string source, string destination)
{
try
{
DataContext destinationDB = DataConnection.Destination(destination);
Table<ABC> destinationABCs = destinationDB.ABCs;
DataContext sourceDB = DataConnection.Destination(source)
Table<ABC> sourceABCs = sourceDB.ABCs;
foreach (ABC ABCCode in sourceABCs)
{
ABC destABCCode = destinationABCs.SingleOrDefault(x => x.Id == ABCCode.Id);
bool same = EntityProcessing.AreIdentical(ABCCode, destABCCode);
if (same == false)
{
destABCCode = (ABC)EntityProcessing.Synchronize(ABCCode, destABCCode);
}
}
ChangeSet test = destinationDB.GetChangeSet(); // Test Line For Debugging
destinationDB.SubmitChanges();
}
return true;
}
}
下一节课是:
Public Static Class EntityProcessing
{
Public Static Bool AreIdentical(Object sourceEntity, Object destinationEntity)
{
if (sourceEntity.GetType() == destinationEntity.GetType())
{
Type t = sourceEntity.GetType();
FieldInfo[] tList = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (FieldInfo fi in tList)
{
if ((fi.GetValue(sourceEntity) != null ? fi.GetValue(sourceEntity).ToString()
: null) == (fi.GetValue(destinationEntity) != null ?
fi.GetValue(destinationEntity).ToString() : null))
{ continue; }
else
{ return false; }
}
return true;
}
else
{ return false; }
}
Public Static Object Synchronize(Object sourceEntity, Object destinationEntity)
{
if (sourceEntity.GetType() == destinationEntity.GetType())
{
Type t = sourceEntity.GetType();
FieldInfo[] tList = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (FieldInfo fi in tList)
{
fi.SetValue(destinationEntity, fi.GetValue(sourceEntity));
}
}
return destinationEntity;
}
}
我也尝试将 EntityProcessing.Synchronize 方法修改为 Void 方法。两者都不起作用。两者都将返回正确的实体,并将字段设置为适当的结果。问题在于 LINQ 无法识别实体已更改。
如果我添加一个临时行ChangeSet test = destinationDB.GetChangeSet();,更新计数为零。损失似乎在于转换为对象。
我尝试在EntityProcessing.Synchronize() 方法上将参数类型设置为ABC 并修改一个字段,test 中的更新计数是正确的。我该如何解决这个问题?
如何将更新的实体提交到数据库,或者更确切地说,如何让 LINQ 识别这些实体正在更改并需要更新?
【问题讨论】:
-
EntityProcessing.Synchronize()的正文发生了什么? -
我在这里看不到泛型。他们在哪里?
-
@Mark Cidade,@David B,已添加通用方法。感谢您提供任何和所有帮助。
标签: c# linq linq-to-sql generics partial-classes