В настоящее время я пытаюсь создать класс, который использует дженерики, чтобы уменьшить объем работы, необходимой для будущей разработки. Когда я добавляю таблицы в конструктор 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. Ни то, ни другое не работает. Оба вернут правильный Entity с полями, установленными на соответствующие результаты. Проблема заключается в том, что LINQ не распознает сущности как измененные.
Если я добавлю временную строку ChangeSet test = destinationDB.GetChangeSet();
, счетчик обновлений будет равен нулю. Похоже, что потеря в преобразовании в объекты.
Я попытался установить тип параметра на ABC
в методе EntityProcessing.Synchronize()
и изменить поле, и счетчик обновлений в test
правильный. Как мне решить это?
Как передать обновленные сущности в базу данных, или, вернее, как заставить LINQ распознать, что эти сущности изменены и нуждаются в обновлении?