【问题标题】:Prevent EF6 from generate navigation properties防止 EF6 生成导航属性
【发布时间】:2014-11-13 10:53:42
【问题描述】:

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

我正在从数据库中生成我的模型,这个过程会根据 DB ForeignKeys 自动创建所有关联。并在 Associations/FK 中为该字段生成一个“导航属性”。

我想获得没有导航属性的实体的“平面版本”。只是一个具有与表列对应的属性的类。

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

提前致谢

【问题讨论】:

  • 我真的很好奇:你为什么不想要这些属性?
  • 目的是为代码生成创建T4模板,需要知道表的真正列结构是什么。由于概念模型用导航道具替换字段,我得到的信息不准确。

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


【解决方案1】:

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

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

寻找这两行

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

(可能在第 50 行左右)

<#=codeStringGenerator.NavigationProperty(navigationProperty)#>

(可能在第 100 行左右)

并擦除这些行。

现在,当您保存模板时,您的类将在没有导航属性的情况下重新生成。

【讨论】:

    【解决方案2】:

    找到解决方案

    当我阅读概念模型时,我得到了关于表结构的不准确信息,因为 edmx 上的概念模型,因为当我们有外键时,会创建关联和导航道具而不是常规属性(在字段上与 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);
    

    【讨论】:

    • 我认为您的问题没有讲到一半。这个MetadataLoader 目前没有在 t4 模板中使用。如果你是从头开始创建 t4 模板,你应该已经展示了一些代码。
    • @GertArnold 嗨,在我找到解决方案之前,我认为我的问题出在 Edmx 模型生成的某个地方,因为在设计器上,我们只能看到 NavProps。在对 Edmx 文件进行一些挖掘之后,我意识到我可以基于 StoreModel 而不是 ConceptualModel 创建我的 T4 模板
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多