1

我这样问这个问题是因为我可以想象有一个潜在的简单但 Devart 特定的解决方案,但对于任何类似情况也可能是一个非常通用的解决方案。

我正在使用 Devart LINQ To Oracle,通常您在设计时在 lqml 文件中创建一个类ItemX,并指定它后面的表。然后,在运行时,您使用 aTable(Of ItemX)来查询数据库。到现在为止还挺好。

现在我遇到了一种情况,我有两个相同的表ItemXItemY,并且我需要根据运行时标志从一个或另一个查询。除此之外,所有代码都是相同的,我想保持这种方式。但是,它Table(Of ItemX)是强类型的,因此我需要所有内容的重复版本,唯一的区别是数据类型。

因此,Devart 特定的解决方案将是:有一个名为的项目类,只是,,Item但在运行时做一些事情,以便 Devart DataContext 使用不同的后备表。然后所有代码都使用基础Item对象,但是当持久化到数据库和从数据库持久化时,它知道要使用哪个表。有没有办法做到这一点?

更通用的方法是连接到 IQueryable 链中,以便它在内部使用ItemXandItemY类,但将所有内容转换为Item外部签名中的基类。我什至无法清楚地描述这个问题。有没有办法做到这一点?

4

1 回答 1

1

您可以通过手动创建一个基类(未映射到任何表)和它的两个“平凡”后代(每个都映射到您使用的表之一)来实现此场景。

更准确地说,应执行以下步骤:

  • 生成具有对应于任一表的实体类的模型;
  • 将此实体类从生成的代码中移到其他地方;
  • 从此类中删除 Table 属性;
  • (可选)将类重命名为,例如,“ItemBase”;
  • 声明该类的两个公共后代(例如,“ItemX”和“ItemY”);
  • 在每个后代上设置指向正确表的 Table 属性;
  • 删除 DataContext 类的“ItemBases”属性(返回 Devart.Data.Linq.Table 对象的属性;当然,它可能有其他名称),并添加返回 Table 和 Table 的类似属性。

因此,这应该看起来像

namespace MyContext {

  public partial class ItemBase : INotifyPropertyChanging, INotifyPropertyChanged {
    ... // Generated code.
  }

  [Table(Name = @"ItemXs")]
  public partial class ItemX : ItemBase {}

  [Table(Name = @"ItemYs")]
  public partial class ItemY : ItemBase {}

  public partial class MyDataContext {

    public Devart.Data.Linq.Table<ItemX > ItemXs {
      get { return this.GetTable<ItemX>(); }
    }

    public Devart.Data.Linq.Table<ItemY> ItemYs {
      get { return this.GetTable<ItemY>(); }
    }
  }

}
于 2012-02-09T16:15:08.303 回答