我目前正在尝试创建一个使用泛型的类,以减少未来开发所需的工作量。当我将表添加到LINQ To SQL Designer时,每个方法都使用了某些基本方法。我希望使用一个通用类,而不是在与每个新表关联的每个Partial类中重现它们。问题是对实体的任何更改都不会被识别,因此不会提交。
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();
的临时行,则更新的计数为零。丢失似乎是在转换为对象。
我尝试在ABC
方法上将参数类型设置为EntityProcessing.Synchronize()
并修改字段,test
中的更新计数正确无误。我该如何解决这个问题?
如何将更新的实体提交到数据库,或者更确切地说,如何让LINQ识别这些实体并且需要更新?
答案 0 :(得分:0)
您的意思是:Public Static Bool Synchronize<ABC>(string source, string destination)
以“ABC”作为通用类型吗?
但是,我认为您的.ABCs
不会那么简单。您可能必须使用反射来获得该特定名称的proeprty。例如,首先使用反射来获取类型参数(ABC)的名称,然后使用反射根据此类型名称从数据源中获取表字段。