我创建了一个视图“供应商”,显示表“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的子集)。如果还有其他方法可以做到,我很乐意收到提示。
您无法在视图上定义ForeignKey
和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);
mapper是在IMapper
中定义的AutoMapper接口。
有时人们应该弄清楚DTO映射技术是传统数据库视图的替代品。