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

alz*_*mar 5 c# sql-server entity-framework foreign-key-relationship

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

create View Supplier as
  select * from T_ADRESSEN where IsSupplier = 1
Run Code Online (Sandbox Code Playgroud)

在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的子集).如果还有其他方法可以做到,我很乐意收到提示.

Bel*_*ash 2

您无法在视图上定义ForeignKeyand 。InverseProperty在您的情况下,您需要使用那个丑陋的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);
Run Code Online (Sandbox Code Playgroud)

其中 Mapper 是AutoMapperIMapper中定义的接口。

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