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

时间:2016-04-26 11:21:16

标签: c# sql-server entity-framework foreign-key-relationship

我创建了一个视图" Supplier"它显示了表格中的列" T_ADDRESS"。该视图被声明为(我知道,' *'视图中是禁止的)

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

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

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

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

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

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

我要做的是让供应商'在我的EF模型中(作为T_ADDRESS的子集)。如果有其他方法可以做到这一点,我很乐意收到提示。

1 个答案:

答案 0 :(得分: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是AutoMapper中定义的IMapper接口。

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