防止EF6生成导航属性

时间:2014-11-13 10:53:43

标签: entity-framework-6 t4 navigation-properties

我最近开始使用EF6,并且我正在构建一些T4模板以自动生成一些代码(在VS2012上)。

我从数据库生成我的模型,此过程基于DB ForeignKeys自动创建所有关联。并生成太多的导航属性"在Associations / FK中的那个字段。

我希望得到一个" Flat版本"我的实体没有导航属性。只是一个具有与表列对应的属性的类。

有没有办法从数据库生成模型"得到这个?我尝试使用选项"在模型中包含外键列来更新模型"未经检查,但关联和导航道具仍在生成。

提前致谢

2 个答案:

答案 0 :(得分:1)

您必须编辑构建模型类的t4模板才能完成此任务。

在您的项目中,您会找到两个.tt文件,例如ModelName.Context.ttModelName.tt。后者是构建模型类的那个。

寻找这两行

this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();

(可能在第50行附近)

<#=codeStringGenerator.NavigationProperty(navigationProperty)#>

(可能在第100行附近)

并删除这些行。

现在,当您保存模板时,将重新生成您的类,而不会导航属性。

答案 1 :(得分:0)

解决方案

当我阅读概念模型时,我得到了关于表结构的未知信息,因为edmx上的概念模型,因为当我们有外键时,会创建关联并使用Nav props而不是常规属性(在字段上)与FK合作。)

我找到的解决方案是使用商店模型而不是概念模型

获取概念模型“错误的方式”

MetadataLoader loader = new MetadataLoader(this);
EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);

获取商店模式“GOOD way”

MetadataLoader loader = new MetadataLoader(this);
StoreItemCollection ItemCollection = null;
loader.TryCreateStoreItemCollection(inputFile, out ItemCollection);