用于抽象集合的 EF6 继承和 WPF dataViewSource class

EF6 inheritance and WPF dataViewSource for collection of abstract class

我有以下带 EF 的模型

public abstract class Shape
{
   public int  Id { get; set;}
   public string  Name { get; set;}
   public string Color { get; set;}
}

public class Rectangle: Shape
{
   public double Width { get; set;}
   public double Height { get; set;}
}

public class Circle: Shape
{
   public double Radius {get; set;}
}

public class Holder
{
   public int Id { get; set;}
   ...
   public int SomeProperty { get;set;}
   ...
   public ObservableCollection<Shape> MyShapes { get; set;}
}

public class Context: DBContext
{  
   ...

   public DBSet<Shape> Shapes { get; set;}
   public DBSet<Holder> Holders { get; set;}
}

在 WPF 应用程序中使用它的最佳方式是什么以及如何为数据网格设置 dataviewSource?

我想要这样的东西:

  1. 显示所有 Holder 的主数据网格(或列表框或树视图)
  2. 当主数据网格的一个项目被选中时,第二个数据网格显示所有的 MyShapes,它们是矩形;第三个数据网格仅显示该项目的圆圈。
  3. 用户可以在数据网格上添加和删除行

例如我有代码隐藏

circleViewSource.Source =(holderViewSource.View.CurrentItem as Holder).MyShapes
rectangleViewSource.Source =(holderViewSource.View.CurrentItem as Holder).MyShapes

并进入 xaml 的资源 我有

<CollectionViewSource x:Key="circleViewSourceViewSource" d:DesignSource="{d:DesignInstance {x:Type Circle}, CreateList=True}"/>
<CollectionViewSource x:Key="rectangleViewSource" d:DesignSource="{d:DesignInstance {x:Type Rectangle}, CreateList=True}"/>

例如,我想在第二个数据网格中添加一个矩形时遇到问题。例外情况是数据网格尝试创建抽象 class 形状而不是矩形。

我在数据库中有三个 table(TPT 方法)(形状、矩形、圆形),因为我希望这两个形状具有不同的 ID 和名称。

我哪里做错了?

我在数据网格中禁用了 CanUserAddRows

CanUserAddRows="False"

并添加了两个按钮:第一个添加新的矩形,第二个添加新的圆形到所选持有人的我的形状集合中。

我还删除了 code.behind 中与 holderViewSource 的 CurrentItem 相关的部分。一切都可以在 xaml 中通过绑定和 DataTemplate 完成。