关于Entity Framework 5 从数据库生成模型时没有字段注释的解决方法!
目前用到了EF5进行模型创建,发现从数据库生成过来的实体中并没有包含字段的说明信息(鄙视下微软,这么简单的问题都不给解决下,太粗枝大叶了),网上找到了EFTSQLDocumentation.Generator.exe的相关方法,但按照操作后,死活没有字段说明信息,只好看其源码,最终发现是xmlns的命名空间不对导致的,程序中给写死了,没法用。自己就哪来修改下,变成可视化直接操作的windows应用程序,分享与大家!
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
var connectionString = this.txtConnectionString.Text;
var fromEdmx = this.txtFrom.Text;
var toEdmx = this.txtTo.Text;
var nameSpace = this.txtNamespace.Text;
if (connectionString == "")
{
MessageBox.Show("请填写数据库链接字符串!");
return;
}
if (fromEdmx == "")
{
MessageBox.Show("请填写源Edmx文件的物理路径!");
return;
}
if (toEdmx == "")
{
MessageBox.Show("请填写新生成Edmx文件的物理路径!");
return;
}
if (nameSpace == "")
{
MessageBox.Show("请填写Edmx中的xmlns命名空间(每个版本可能不一样)!");
return;
}
try
{
var creater = new Creater(connectionString, fromEdmx, toEdmx, nameSpace);
creater.CreateDocumentation();
creater.Dispose();
MessageBox.Show("操作成功了,哥们!如何谢我?");
}
catch (Exception ex)
{
MessageBox.Show("对不住,兄弟,可能是你的错,也可能是我的错!参考下具体信息:" + ex.Message);
//throw;
} }
} public class Creater
{
public String ConnectionString { get; set; }
public String InputFileName { get; set; }
public String OutputFileName { get; set; }
public SqlConnection Connection { get; set; }
public String XmlnsNameSpace { get; set; } public Creater(String connectionString, String inputFileName, String outputFileName, string nameSpace)
{
this.ConnectionString = connectionString;
this.InputFileName = inputFileName;
this.OutputFileName = outputFileName;
this.XmlnsNameSpace = nameSpace;
this.Connection = new SqlConnection(connectionString);
this.Connection.Open();
}
public void Dispose()
{
this.Connection.Dispose();
}
public void CreateDocumentation()
{ var doc = XDocument.Load(this.InputFileName);
var entityTypeElements = doc.Descendants("{" + XmlnsNameSpace + "}EntityType"); var i = ;
foreach (var entityTypeElement in entityTypeElements)
{
var tableName = entityTypeElement.Attribute("Name").Value;
var propertyElements = entityTypeElement.Descendants("{" + XmlnsNameSpace + "}Property"); this.AddNodeDocumentation(entityTypeElement, GetTableDocumentation(tableName)); foreach (var propertyElement in propertyElements)
{
var columnName = propertyElement.Attribute("Name").Value;
this.AddNodeDocumentation(propertyElement, GetColumnDocumentation(tableName, columnName));
}
} if (File.Exists(this.OutputFileName))
File.Delete(this.OutputFileName);
doc.Save(this.OutputFileName);
}
private void AddNodeDocumentation(XElement element, String documentation)
{
if (String.IsNullOrEmpty(documentation))
return;
element.Descendants("{" + XmlnsNameSpace + "}Documentation").Remove(); element.AddFirst(new XElement("{" + XmlnsNameSpace + "}Documentation", new XElement("{" + XmlnsNameSpace + "}Summary", documentation)));
}
private String GetTableDocumentation(String tableName)
{
using (var command = new SqlCommand(@" SELECT [value]
FROM fn_listextendedproperty (
'MS_Description',
'schema', 'dbo',
'table', @TableName,
null, null)", this.Connection))
{ command.Parameters.AddWithValue("TableName", tableName); return command.ExecuteScalar() as String;
}
}
private String GetColumnDocumentation(String tableName, String columnName)
{
using (var command = new SqlCommand(@"SELECT [value]
FROM fn_listextendedproperty (
'MS_Description',
'schema', 'dbo',
'table', @TableName,
'column', @columnName)", this.Connection))
{ command.Parameters.AddWithValue("TableName", tableName);
command.Parameters.AddWithValue("ColumnName", columnName); return command.ExecuteScalar() as String;
}
}
}
关于Entity Framework 5 从数据库生成模型时没有字段注释的解决方法!的更多相关文章
- [VSTS]让ADO.NET Entity Framework支持Oracle数据库(转载)
近期由于项目所需不得不研究Oracle数据库,回想上一次用Oracle还是07年的事情,实习时候做华晨宝马的项目简单接触了Oracle.这次的项目需要基于.NET平台,我个人的习惯是能用微软自带的就不 ...
- 让ADO.NET Entity Framework支持Oracle数据库
Oracle最近发布了 Oracle Data Access Component(ODAC)11. 2 Rel 4,其中增加了对 Entity Framework 4.1 和4.2的支持.这让 .NE ...
- 使用Entity Framework Core访问数据库(DB2篇)
前言 上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子 ...
- 使用Entity Framework Core访问数据库(Oracle篇)
前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...
- Django教程:[33]从数据库生成模型
在使用django做网站的时候,有时候我们的数据库来自一个已有的数据库,如何整合这个数据库呢? django提供了方便的方法来整合已有数据库,下面我们看看具体的方法: 1.先来设置数据库:在网站文件夹 ...
- DataUml Design 教程7 - 数据库生成模型
DataUml Design支持数据库生成模型,并支持外键关系,能够根据外键自动生成类与类之间的关系. 目前DataUML Design支持MS Server.MY SQL.Oracle和Access ...
- entity framework无法写入数据库.SaveChanges()失败
参考https://stackoverflow.com/questions/26745184/ef-cant-savechanges-to-db/28256645 https://www.codepr ...
- Log4Net 生成多个文件、文件名累加解决方法
Log4Net 生成多个文件.文件名累加解决方法 项目中的WCF服务里采用Log4Net用来记录异常日志,但部署后,生成的日志会出现多个累加文件,如下图: WCF是寄宿在IIS上,包含了5个SVC服务 ...
- Entity Framework连接Mysql数据库并生成Model和DAL层
Entity Framework (EF,ADO.NET Entity Framework)是微软官方提供的.NET平台的ORM框架.相比于LINQ TO SQL,EF框架具有很明显的优势: EF框架 ...
随机推荐
- data guard switchover切换异常
data guard switchover切换异常 查看DG数据库备份库发现,switchover_status为SWITCHOVER LATENT SQL> select OPEN_MODE, ...
- AStyle代码格式工具在source insight中的使用
一.AStyle下载路径 Astyle为开源项目,支持C/C++和java的代码格式化 Home Page: http://astyle.sourceforge.net/ Project Page: ...
- Copying Linked Lists with Random Pointers
Copying Linked Lists with Random Pointers 两个方法:方法一: 1.不考虑随机指针的情况下复制链表: 2.在复制过程中建立一个以原链表节点地址为key,相应的复 ...
- java HastTable实现
public class HashTable{ private String[] name; //关键字 private int sum; //容量 public static void ...
- Solr -- Solr Facet 1
一.Facet介绍 solr facet 是solr搜索的一大特色,facet不好翻译,有说是垂直搜索,有说是分片搜索,但都不是很好,还是懒得翻译了,就叫facet ,具体功能看下面的例子意会吧. 比 ...
- APP界面设计之页面布局的22条基本原则
移动 APP 页面布局(Layout)是我们设计 app 界面的时候,最主要的设计任务.一个 app 的好与不好,很大部分取决于移动 APP 页面布局的合理性. 下图为 APP 最原始的布局模型. 页 ...
- js中singleton模式解析及运用
singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...
- Linux学习笔记25——命名管道(FIFO)
1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...
- http 协议的过程
当你输入某个网址的时候发生了什么? 首先:你该知道 a.http协议是应用层协议,他是浏览器像服务器请求网页,服务器返回网页的过程,他是基于tcp协议的. 1.假设随便输入输入域名 http://ww ...
- javascript:void到底是个什么?
一般都是用作 实现 如下功能,当点击一个超链接的时候,不想出发超链接自带的动作,而触发自定义的js方法,一般与onclick 一起出现.如果不写void(0)点击超链接时候虽然调用js方法,但是也会出 ...