如何以编程方式生成基于DbContext的实体框架模型DbFirst

时间:2014-02-25 20:17:58

标签: .net entity-framework

我正在寻找一种方法,以编程方式为基于DbContext的给定数据库生成实体框架模型Database First。

现在,我一直在尝试使用System.Data.Entity.Design.EntityCodeGenerator类,但似乎只是基于ObjectContext生成它们。

http://msdn.microsoft.com/en-us/library/system.data.entity.design.entitycodegenerator(v=vs.110).aspx

在这里,我找到了有关如何使用它的信息: http://blogs.msdn.com/b/adonet/archive/2008/06/20/edm-tools-options-part-1-of-4.aspx

但仍然只生成基于ObjectContext的模型。

更新:我需要在Visual Studio扩展中执行此操作(因此它将Visual Studio作为沙箱)。

1 个答案:

答案 0 :(得分:1)

好的,我终于找到了一种方法,而不是使用System.Data.Entity.Design.EntityCodeGenerator为模型后端(例如Model.Designer.cs)生成代码,现在我只是将.edmx添加到Visual Studio项目,设置一些属性,Visual Studio负责一切:

private void AddToProject( string edmxPath)
    {
      string edmxCodePath;
      ProjectItem pi = _vsProj.Project.ProjectItems.AddFromFile(edmxPath);
      // this little magic replaces having to use System.Data.Entity.Design.EntityCodeGenerator
      pi.Properties.Item("ItemType").Value = "EntityDeploy";
      pi.Properties.Item("CustomTool").Value = "EntityModelCodeGenerator";
      if( efVersion == BaseWizard<BaseWizardForm, BaseCodeGeneratorStrategy>.ENTITY_FRAMEWORK_VERSION_6)
      {
        // For EF6 we use DbContext instead of ObjectContext based context.
        _vsProj.DTE.SuppressUI = true;
        EnvDTE80.Solution2 sol = (EnvDTE80.Solution2)_vsProj.DTE.Solution;
        string itemPath = "";
        if( this.Language == LanguageGenerator.CSharp )
        {
          itemPath = sol.GetProjectItemTemplate("DbCtxCSEF6", "CSharp" );
        } else {
          itemPath = sol.GetProjectItemTemplate("DbCtxVBEF6", "VisualBasic");
        }
        pi.ProjectItems.AddFromTemplate(itemPath, this._modelName);
        // update $edmxInputFile$
        string path = Path.GetDirectoryName(edmxPath);
        string templateName = Path.Combine(path, _modelName + ".tt");
        string contents = File.ReadAllText(templateName);
        File.WriteAllText(templateName, contents.Replace("$edmxInputFile$", _modelName + ".edmx"));
        templateName = Path.Combine(path, _modelName + ".Context.tt");
        contents = File.ReadAllText(templateName);
        File.WriteAllText(templateName, contents.Replace("$edmxInputFile$", _modelName + ".edmx"));
      }
    }

说明:该方法接收生成的.edmx文件的路径,如果EF版本为6,模板“DbCtxCSEF6”即时(总是与VS2013一起安装),那么只需更换$ edmxInputFile $使用edmx文件名; Visual Studio将自动添加.tt模板并生成后端代码。

有关上下文中的更多详细信息,请参阅MySql for Visual Studio 1.2.1或更高版本中的MySql.Data.VisualStudio.Wizards.EntityFrameworkGenerator类的代码。

安装人员和源代码(其开源代码)可在以下网址获得:

http://dev.mysql.com/downloads/windows/visualstudio/