【问题标题】:LINQ Changes Not Recognized When Using Generics使用泛型时无法识别 LINQ 更改
【发布时间】: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


【解决方案1】:

您的意思是:Public Static Bool Synchronize&lt;ABC&gt;(string source, string destination) 将“ABC”作为泛型类型?

但是,我认为您的 .ABCs 不会那么简单。您可能必须使用反射来获得具有该特定名称的属性。比如先用反射得到类型参数的名字(ABC),再用反射根据这个类型名从数据源中获取表字段。

【讨论】:

  • 我已将方法添加到 EntityProcessing 类。这可能会帮助您更好地理解我的意图。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多