使用 entity framework 在视图上创建伪外键

Create a pseudo foreign key on a view using entity framework

我创建了一个视图 "Supplier",它显示 table "T_ADDRESS" 中的列。视图被声明为(我知道,“*”在视图中是不允许的)

create View Supplier as
  select * from T_ADRESSEN where IsSupplier = 1

在 EF 中,我想使用视图,因为它比丑陋的视图更具可读性 "T_ADRESSEN"。到目前为止很简单。

现在是棘手的部分(对我而言)。 table T_ADDRESS 有一个自引用外键 "MainAddressId" 指向 T_ADDRESS.

创建 DB-first(或来自 DB 的 CodeFirst)将为 tableT_ADDRESS(和导航属性)创建 FK 关系,但不会为视图 'Supplier' .当然不是:EF 对 FK 关系一无所知(尽管视图公开了相同的列)。

现在我尝试在 Supplier-class 上的代码优先模型中使用 'ForeignKey' 和 'InverseProperty' 属性,但这给了我一个 ModelValidationException。也很清楚:没有这样的FK关系。

尽管约束不存在,我如何告诉 EF 将字段视为外键?

我想要做的是在我的 EF 模型中包含 'Suppliers'(作为 T_ADDRESS 的子集)。如果有其他方法,我很乐意收到提示。

您不能在视图上定义 ForeignKeyInverseProperty。在您的情况下,您需要使用丑陋的 T_ADRESSEN table 并使用 [AutoMapper][1] 将其映射到 DTO class。在您的情况下,T_ADRESSEN 是上下文 table,Supplier 是您的 DTO class。

使用 AutoMapper,您可以执行如下操作:

       var ugly = context.T_ADRESSEN.Where(e=>e.IsSupplier ==1);
       var suppliers = mapper.Map<IEnumerable<Supplier>>(ugly);

其中 mapper 是 IMapperAutoMapper 中定义的接口。

有时人们会发现 DTO 映射技术可以替代传统的数据库视图。