如何分离出EF的三份结构定义文件
且看一个念念不忘的故事:三个月前进入到一个外包项目,一切以解决问题为先导,而不管你用什么技术或工具。于是采用了EF来管理不超过10个表的小功能。确实是啥sql语句都没写,直接linq to entity,爽歪歪。遇上表改动大,则全部删掉edmx重来,小小改动则表和实体定义同步手写改。最后觉得不爽了,又把这部分Dal移出去成一个单独的dll,这时候遇上生手会遇上的加载元数据失败的问题,也就是找不到那三份文件了,因为默认是嵌入到dll作为资源。然后appconfig里面的链接字符串也指定了路径,一旦移动edmx目录,则会报错。这时候采取的办法是直接删掉edmx,再生成得到一份app.confg,把这份文件里面的链接字符串copy覆盖到原来工程里的链接。OK搞定。看EF就是这么简单的样子。最后,项目集成了,这个应用要被集成到sharepoint里面去,sharepoint这玩意需要所有引用dll强命名,并且被安装到GAC,我不明白sharepoint为什么需要这么做,做sharepoint这部分的是来自微软的同事,至今都没去研究sharepoint,精力有限,当是就这一点,以及加另外一点它要求我写的用户控件还要按一定的格式去改才能跑在sharepoint里面,我就不喜欢它了。回到原点,我和另外一个负责集成的同事整整花了一个下午的时间都没搞定元数据加载失败的错误,尝试过n多方法,因为那个见鬼的环境不允许访问internet,查个东西要去另外一个房间的公共机器,你知道这让人出离愤怒。随后我离开了那个项目,离开了那个公司。但是心里一直在挂念这这个问题。
现在我稍微有点空闲了,然后老老实实每天一两章的开始看《Programming Entity Framework, 2nd Edition》,然后看到了分离三份文件的方法,下面是步骤:
1, edmx文件右键属性,设置生成操作为EntityDeploy。
2, 双击edmx,打开模型视图,在空白处右键选择模型浏览器在紧靠edmx下面类似XXXXModel的文件上面右键属性,设置元数据项目处理为输出到目录,然后你会看到链接字符串已经指向到bin,类似metadata=~/bin/Model1.csdl|~/bin/Model1.ssdl|~/bin/Model1.msl;provider=System.Data.SqlClient;providerconnectionstring="DataSource=WUSONG-PC\SQL2008;Initial Catalog=BreakAway;Integrated Security=True;MultipleActiveResultSets=True"
通过以上步骤,三份结构文件就已经分离出来,随你安放了。不用劳烦资源找不到的问题。
3,完全自定义连接实例:
app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="BreakAwayEntities" connectionString="provider=System.Data.SqlClient;provider connection string="Data Source=WUSONG-PC\SQL2008;Initial Catalog=BreakAway;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
var connectionString = ConfigurationManager.ConnectionStrings["BreakAwayEntities"].ConnectionString;
var connectionStringBuilder = new EntityConnectionStringBuilder(connectionString);
connectionStringBuilder.Metadata = @"d:\BAEntities.csdl|d:\BAEntities.ssdl|d:\BAEntities.msl";
var context = new BreakAwayEntities(connectionStringBuilder.ConnectionString);
var address = context.Address.ToList();
foreach (Address addr in address)
{
Console.WriteLine(addr.City);
}
Console.Read();