笔者在利用Entity
Framework中的Scaffolding机制自动成立拓展名称为mdf的数据库及表单时,遇到如下的不当:

在品种中用程序中置放mdf文件的方式来进行SQLServer数据库开发至极方便,用来发表开源项目等很有益于,点击就足以运作,免布局,尤其是在教学中用起来尤其有利于,老师不用先将数据库文件detach再发给学员,学生也不用将数据库文件attach。选取项目中放置mdf文件的法门,老师把教学的代码发给学生,学生打开就能够运作。笔者在传智播客.net培养和陶冶班教学中正是用的那种方式展开教学。

在档次中用程序中置放mdf文件的不二等秘书诀来进展SQLServer数据库开发万分便利,用来发布开源项目等很有益,点击就能够运维,免布局,特别是在教学中
用起来更为有益于,老师不用先将数据库文件detach再发放学生,学生也不用将数据库文件attach。选择项目中置放mdf文件的主意,老师把教学的代
码发给学生,学生打开就足以运作。小编在传智播客.net培养和锻练班教学中正是用的那种方法展开讲解。

在类型中用程序中置放mdf文件的措施来开始展览SQLServer数据库开发十一分便利,用来发布开源项目等很便宜,点击就足以运作,免布局,越发是在教学中用起来尤其有利,老师不用先将数据库文件detach再发给学员,学生也不用将数据库文件attach。选择项目中放置mdf文件的点子,老师把教学的代码发给学生,学生打开就足以运作。

A file activation error occurred. 
The physical file name '\\MusicDBContext.mdf' may be incorrect. 
Diagnose and correct additional errors, and retry the operation.
CREATE DATABASE failed. Some file names listed could not be created. 
Check related errors.

在ASP.net程序中若是将mdf文件放到项指标App_Data文件夹即可,在连年字符串中动用
Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated
Security=True;User Instance=True
做连接字符串即可。

在ASP.net程序中只要将mdf文件放到项指标App_Data文件夹即可,在连接字符串中选取
Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated
Security=True;User Instance=True
做连接字符串即可。

在ASP.net程序中1旦将mdf文件放到项目标App_Data文件夹即可,在接连字符串中采取
Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated
Security=True;User Instance=True
做连接字符串即可。


而是在WinForm先后中,假使在项目标App_Data文件夹中新建几个mdf文件,然后用
Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated
Security=True;User Instance=True
开始展览连接会提醒找不到CallCenter.mdf。原来WinForm程序并不会去App_Data中找mdf文件。原来在ASP.net中DataDirectory的值是眼前项目标App_Data路径,而WinForm中的DataDirectory值则是最近项目标门路,由此Winform中mdf文件不用放到App_有关DataDirectory的壹部分斟酌,WinForm程序中两份mdf文件难点的缓解。Data中,放到项目根目录下就足以。

而是在WinForm先后中,假如在品种的App_Data文件夹中新建叁个mdf文件,然后用
Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated
Security=True;User Instance=True
进行连接会提醒找不到CallCenter.mdf。原来WinForm程序并不会去App_Data中找mdf文件。原来在ASP.net中
DataDirectory的值是当下项目标App_Data路径,而WinForm中的DataDirectory值则是眼下项目标路径,由此Winform中mdf文件不用放到App_Data中,放到项目根目录下就足以。

只是在WinForm先后中,假设在项指标App_Data文件夹中新建贰个mdf文件,然后用
Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated
Security=True;User Instance=True
进展连接会提醒找不到CallCenter.mdf。原来WinForm程序并不会去App_Data中找mdf文件,在ASP.net中DataDirectory的值是时下项指标App_金沙注册送58 ,Data路径,而WinForm中的DataDirectory值则是当前项目标不二诀要,因而Winform中mdf文件不用放到App_Data中,放到项目根目录下就足以。

 

可是新题材随即又来了,在WinForm中用那种办法开发的时候偶然改了花色中mdf文件中的表中的多寡照旧表结构,运维的时候却发现运转时通进度序读取的数量恐怕表结构未有变,而有时调节和测试时Insert插入的数目在本次调节和测试的时候竟然未有了。经过探讨发现,WinForm程序运转的时候总是的是bin/Debug下的mdf文件,而不是种类中的mdf文件,那是和ASP.net程序作为分裂的地点。每回程序发生Build行为的时候,项目中的mdf就会覆盖bing/Debug下的mdf文件,相当于有多少个mdf文件的存在,项目中的mdf相当于“源文件”。即使能够通过修改文件的“BuildToOuput”属性来一些缓解难题,不过依旧不是很周到。

然则新题材随即又来了,在WinForm中用那种办法开发的时候偶然改了花色中mdf文件中的表中的数量可能表结构,运维的时候却发现运转时通进程序读
取的数码大概表结构未有变,而有时调节和测试时Insert插入的数额在这一次调节和测试的时候甚至未有了。经过商讨发现,WinForm程序运转的时候总是的是
bin/Debug下的mdf文件,而不是项目中的mdf文件,那是和ASP.net程序行为分裂的地点。每趟程序产生Build行为的时候,项目中的
mdf就会覆盖bing/Debug下的mdf文件,也便是有四个mdf文件的留存,项目中的mdf也正是“源文件”。即便能够透过修改文件的
“BuildToOuput”属性来1些缓解难点,可是仍旧不是很周到。

唯独新题材随即又来了,在WinForm中用那种方式支付的时候偶然改了项目中mdf文件中的表中的数目如故表结构,运营的时候却发现运维时通进度序读取的数码照旧表结构没有变,而有时调节和测试时Insert插入的多少在此番调节和测试的时候甚至未有了。经过商量发现,WinForm程序运维的时候总是的是bin/Debug下的mdf文件,而不是项目中的mdf文件,那是和ASP.net程序行为差别的地点。每趟程序发生Build行为的时候,项目中的mdf就会覆盖bin/Debug下的mdf文件,也等于有八个mdf文件的存在,项目中的mdf也正是“源文件”。就算能够经过修改文件的“BuildToOuput”属性来部分消除难题,可是依然不是很完善。

率先想起一下开立这么些顺序的步子:

有三个相比很直白的想法,就是让程序去老是项目中的mdf文件,而不是连接bin/Debug下相当。
透过查询资料找到了改动章程,在Program.cs文件Main函数最开端参预如下代码:
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@”\bin\Debug\”)
                || dataDir.EndsWith(@”\bin\Release\”))
            {
                dataDir =
System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData(“DataDirectory”,
dataDir);
            }

有1个相比较很直白的想法,便是让程序去老是项目中的mdf文件,而不是连接bin/Debug下十分。
通过查询资料找到了改动章程,在Program.cs文件Main函数最开始进入如下代码:
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@”\bin\Debug\”)
                || dataDir.EndsWith(@”\bin\Release\”))
            {
                dataDir =
System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData(“DataDirectory”,
dataDir);
            }

有一个比较很直接的想法,正是让程序去老是项目中的mdf文件,而不是连接bin/Debug下非凡。
由此询问资料找到了修章,在Program.cs文件Main函数最先导加入如下代码:

一、创设1个Console控制台应用程序,程序集名称及命名空间为ConsoleApp;

规律简单分析:连接字符串中的DataDirectory的值正是经过AppDomain.CurrentDomain.SetData赋值过去的,假若当前程序的目录以”\bin\Debug\”或者”\bin\Release\”则以为它是运转在VisualStudio环境中,就取项目标目录然后赋值给DataDirectory这几个key。既然是CurrentDomain.SetData,推测对于非私下认可AppDomain中的数据库连接代码只怕会不起效率(只是估量,没表明),那就要须求创造子AppDomain的时候再去赋值了。

规律简单解析:连接字符串中的DataDirectory的值就是透过AppDomain.CurrentDomain.SetData赋值过去的,如果当前先后的目录以”\bin\Debug\”或者”\bin\Release\”则认为它是运营在VisualStudio环境中,就取项指标目录然后赋
值给DataDirectory那个key。既然是CurrentDomain.SetData,推测对于非默许AppDomain中的数据库连接代码恐怕会不起成效(只是估摸,没评释),那即将须要创设子AppDomain的时候再去赋值了。

string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@”\bin\Debug\”)
                || dataDir.EndsWith(@”\bin\Release\”))
            {
                dataDir =
System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData(“DataDirectory”,
dataDir);
            }

二、使用程序包控制台管理器将Entity Framework包括到此程序中,代码如下:

下边的代码依然有好几秘密的bug的,比如正式的周转的时候exe被很杯具的放到了有些bin\Debug目录下,就会有题目,可是想想正式生产条件运转的时候势必不会用那种AttachDbFilename格局,那种方法只存在于付出环境,因此也就睁一头眼闭二只眼了,呵呵。

地点的代码照旧有少数诡秘的bug的,比如正式的运维的时候exe被很杯具的停放了有个别bin\Debug目录下,就会不不荒谬,可是想想正式生产环境运营的时候肯定不会用这种AttachDbFilename格局,那种艺术只设有于开发条件,因而也就睁三只眼闭3只眼了,呵呵。

规律不难分析:连接字符串中的DataDirectory的值正是经过AppDomain.CurrentDomain.SetData赋值过去的,若是当前程序的目录以”\bin\Debug\”或者”\bin\Release\”则认为它是运作在VisualStudio环境中,就取项指标目录然后赋值给DataDirectory那几个key。既然是CurrentDomain.SetData,估算对于非暗许AppDomain中的数据库连接代码恐怕会不起成效(只是估摸,没表明),那就要要求创建子AppDomain的时候再去赋值了。

PM> install-package Entity Framework

参考资料:

[引用来自 www.rupeng.com/forum/thread-1一9八7-1-一.html]

地点的代码仍旧有好几秘密的bug的,比如正式的运行的时候exe被很杯具的内置了有个别bin\Debug目录下,就会有标题,可是想想正式生产条件运维的时候势必不会用那种AttachDbFilename情势,那种格局只存在于开发条件,由此也就睁3只眼闭三只眼了,呵呵。

三、在App.Config文件上校以下内容插入到configuration节点:

参考资料:http://weblogs.asp.net/avnerk/archive/2005/12/25/433981.aspx
http://www.cnblogs.com/dajianshi/archive/2007/07/06/808495.html

<connectionStrings>
    <add name="MusicDBContext"
       connectionString="Data Source=(LocalDb)\MSSQLLocalDB;
         Initial Catalog=MusicDBContext;Integrated Security=SSPI;
         AttachDBFilename=|DataDirectory|\MusicDBContext.mdf"
       providerName="System.Data.SqlClient" />
</connectionStrings> 

如鹏网.Net培训班正值申请,有互联网的地点就能够加入如鹏网的求学,学完就能高薪就业,点击那里理解

4、在控制台编写以下代码:

 

using System;
using System.Linq;
using System.Data.Entity;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                MusicDbContext db = new MusicDbContext();
                Music music = new Music { Title = "Far Away From Home", 
                                          ReleaseDate = DateTime.Now };
                db.Musics.Add(music);
                db.SaveChanges();
                db.Musics.ToList().ForEach(x => Console.WriteLine($"{x.ID},
                                                {x.Title},{x.ReleaseDate}"));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                if(ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);
                }
            }
            Console.ReadKey();
        }
    }
    public class Music
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public DateTime ReleaseDate { set; get; }
    }
    public class MusicDbContext : DbContext
    {
        public MusicDbContext() : base("MusicDBContext") { }
        public DbSet<Music> Musics { set; get; }
    }
}

 
  三年前假设懂“3层架构”就足以说“精晓分层架构”;以后则须求懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值钱;

五、运转此程序,发现先后不能够按本身想要的结果运转,出现在最终边出现的失实。

    三年前假如会SQLServer就足以说本人“驾驭数据库开发”;未来则需还要求控制MySQL等开源数据库才能算得“.Net开源”时期的程序员;


    三年前若是会举行用户上传内容的安全性处理即可;今后则需求熟悉云存款和储蓄、CDN等才能在云总括时期非常熟稔;

通过查看出错的新闻,发现

    三年前如果精通Lucene.Net就会说本人“熟识站内寻找引擎开发”;以往大家都用ElasticSearch了,你还用Lucene.Net就太老土了;

AttachDBFilename=|DataDirectory|\MusicDBContext.mdf

    三年前发邮件照旧用SmtpClient;未来做大型网站发邮件必须用云邮件引擎;

有题目,而那又是绝非难题的,这到底是怎么回事?为啥会合世错误?

    三年前缓存正是Context.Cache;以后则是Redis、Memcached的五洲;

于是,通过MSDN查找有关材质,通过以下形式赢得DataDirectory钦定的途径是怎么:

    如鹏网再度引领.Net社区技巧时尚!点击那里了解如鹏网.Net最新课程

object path = AppDomain.CurrentDomain.GetData("DataDirectory");

 

运作此行代码,发现path居然是null!!!什么?壹般控制台也许Windows
Form程序依照是Debug依旧Release决定DataDirectory的起首化路径为Bebug文件夹依旧Release文件夹吗?

 

本条错了。

即使原先的Bebug文件夹或Release文件夹存在数据库文件,使用类似”AttachDBFilename=|DataDirectory|\MusicDBContext.mdf”的写法是一向不难点的,

哪怕path = null,它也清楚是在Bebug文件夹或Release文件夹下。

1旦原本的Bebug文件夹或Release文件夹不存在数据库文件,上边包车型大巴写法就有标题,也就会并发最开端现出的那种错误。

那么,我们该怎么着缓解吧?细心的人方可窥见,既然可以动用AppDomain.CurrentDomain.GetData来得到DataDirectory钦点的不二法门,

那及能够利用AppDomain.CurrentDomain.SetData来内定DataDirectory的初始化路径,代码如下:

AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);

透过以上的章程,就能够消除最初步后面包车型地铁题材。


 

经过以上的介绍,最后的代码修改如下:

using System;
using System.Linq;
using System.IO;
using System.Data.Entity;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string dbPath = Environment.CurrentDirectory + @"\MusicDBContext.mdf";
            if(!File.Exists(dbPath))
            {
                AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);
            }
            try
            {
                MusicDbContext db = new MusicDbContext();
                Music music = new Music { Title = "Far Away From Home", ReleaseDate = DateTime.Now };
                db.Musics.Add(music);
                db.SaveChanges();
                db.Musics.ToList().ForEach(x => Console.WriteLine($"{x.ID},{x.Title},{x.ReleaseDate}"));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                if(ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);
                }
            }
            Console.ReadKey();
        }
    }

    public class Music
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public DateTime ReleaseDate { set; get; }

    }

    public class MusicDbContext : DbContext
    {
        public MusicDbContext() : base("MusicDBContext") { }
        public DbSet<Music> Musics { set; get; }
    }
}

次第就足以健康运营了。


 

注:

1)AttachDBFilename=|DataDirectory|\MusicDBContext.mdf 

   
 其中的“\”可以省略掉,即为:AttachDBFilename=|DataDirectory|MusicDBContext.mdf 

二)如若是ASP.NET程序,DataDirectory的起初化目录为App_Data。

三)关于更加多的|DataDirectory|知识,请参见如下:

   
 

   
 

   
 

   

 

相关文章

网站地图xml地图