使用泛型时无法识别LINQ更改

时间:2011-04-27 22:51:07

标签: c# linq linq-to-sql generics partial-classes

我目前正在尝试创建一个使用泛型的类,以减少未来开发所需的工作量。当我将表添加到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识别这些实体并且需要更新?

1 个答案:

答案 0 :(得分:0)

您的意思是:Public Static Bool Synchronize<ABC>(string source, string destination)以“ABC”作为通用类型吗?

但是,我认为您的.ABCs不会那么简单。您可能必须使用反射来获得该特定名称的proeprty。例如,首先使用反射来获取类型参数(ABC)的名称,然后使用反射根据此类型名称从数据源中获取表字段。