使用 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 的子集)。如果有其他方法,我很乐意收到提示。
您不能在视图上定义 ForeignKey
和 InverseProperty
。在您的情况下,您需要使用丑陋的 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 是 IMapper
在 AutoMapper 中定义的接口。
有时人们会发现 DTO 映射技术可以替代传统的数据库视图。
我创建了一个视图 "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 的子集)。如果有其他方法,我很乐意收到提示。
您不能在视图上定义 ForeignKey
和 InverseProperty
。在您的情况下,您需要使用丑陋的 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 是 IMapper
在 AutoMapper 中定义的接口。
有时人们会发现 DTO 映射技术可以替代传统的数据库视图。