使用实体框架在视图上创建伪外键

问题描述 投票:5回答:1

我创建了一个视图“供应商”,显示表“T_ADDRESS”中的列。该视图被声明为(我知道,'*'在视图中是禁止的)

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

在EF中,我想使用视图,因为它比丑陋的“T_ADRESSEN”更具可读性。到目前为止这么容易。

现在是棘手的部分(对我来说)。表T_ADDRESS具有一个自引用外键“MainAddressId”,它指向T_ADDRESS。

创建DB-first(或DBF的CodeFirst)将为表T_ADDRESS(和导航属性)创建FK关系,但不为视图'Supplier'创建。当然不是:EF对FK关系一无所知(尽管视图暴露了相同的列)。

现在我尝试在Supplier-class的代码第一个模型中使用'ForeignKey'和'InverseProperty'属性,但这给了我一个ModelValidationException。同样明确:没有这种FK关系。

虽然约束不存在,但如何告诉EF将字段视为外键?

我想要做的是在我的EF模型中使用“供应商”(作为T_ADDRESS的子集)。如果还有其他方法可以做到,我很乐意收到提示。

c# sql-server entity-framework foreign-key-relationship
1个回答
2
投票

您无法在视图上定义ForeignKeyInverseProperty。在你的情况下,你需要使用那个丑陋的T_ADRESSEN表并使用[AutoMapper][1]将它映射到DTO类。在您的情况下,T_ADRESSEN是上下文表,Supplier是您的DTO类。

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

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

mapper是在IMapper中定义的AutoMapper接口。

有时人们应该弄清楚DTO映射技术是传统数据库视图的替代品。

© www.soinside.com 2019 - 2024. All rights reserved.