当前位置: 365bet亚洲官方投注 > 编程知识 > 正文

有关DataDirectory的有的思忖,WinForm程序中两份md

时间:2019-12-10 20:43来源:编程知识
小编在动用EntityFramework中的Scaffolding机制自动创制扩充名称为mdf的数据库及表单时,遭逢如下的不当: 在品种中用程序中放到mdf文件的办法来开展SQLServer数据库开辟特别方便,用来发布

小编在动用Entity Framework中的Scaffolding机制自动创制扩充名称为mdf的数据库及表单时,遭逢如下的不当:

在品种中用程序中放到mdf文件的办法来开展SQLServer数据库开辟特别方便,用来发布开源项目等很有益,点击就足以运作,免构造,特别是在传授中 用起来越发有利,老师不用先将数据库文件detach再发给学员,学子也不用将数据库文件attach。接受项目中放到mdf文件的艺术,老师把传授的代 码发给学员,学子张开就能够运维。作者在传智播客.net研修班传授中正是用的这种办法开展传授。

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
做连接字符串就能够。


唯独在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中用这种办法开采的时候有时改了类别中mdf文件中的表中的数目或然表构造,运营的时候却发掘运维时经进度序读 取的数额大概表结构未有变,而有时调节和测量检验时Insert插入的多少在这里次调节和测量检验的时候以致没有了。经过钻探开掘,WinForm程序运营的时候总是的是 bin/Debug下的mdf文件,却非连串中的mdf文件,那是和ASP.net程序作为分歧的地点。每趟程序发生Build行为的时候,项目中的 mdf就能够覆盖bing/Debug下的mdf文件,也正是有三个mdf文件的留存,项目中的mdf也正是“源文件”。纵然可以经过改变文件的 “BuildToOuput”属性来部分消除难题,不过依旧不是很周详。

率先想起一下创办这些程序的步子:

有贰个相比很直接的主张,正是让程序去老是项目中的mdf文件,并非连接bin/Debug下十分。
因此询问资料找到了修改章程,在Program.cs文件Main函数最最先加入如下代码:
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@"binDebug")
                || dataDir.EndsWith(@"binRelease"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
            }

1、制造三个Console调控台应用程序,程序集名称及命名空间为ConsoleApp;

原理简单深入深入分析:连接字符串中的DataDirectory的值正是透过AppDomain.CurrentDomain.SetData赋值过去的,假若当前前后相继的目录以"binDebug"或者"binRelease"则以为它是运作在VisualStudio遭逢中,就取项目标目录然后赋 值给DataDirectory那么些key。既然是CurrentDomain.SetData,猜度对于非私下认可AppDomain中的数据库连接代码只怕会不起功用(只是猜想,没注明),那将在须要创立子AppDomain的时候再去赋值了。

2、使用程序包调节台微处理器将Entity Framework富含到此程序中,代码如下:

地点的代码依旧有好几秘密的bug的,举个例子正式的周转的时候exe被很杯具的嵌入了有些binDebug目录下,就能有标题,可是动脑正式临盆情形运营的时候势必不会用这种AttachDbFilename情势,这种方法只存在于付出意况,因而也就睁贰只眼闭三头眼了,呵呵。

PM> install-package Entity Framework

[援引来自 www.rupeng.com/forum/thread-1壹玖捌柒-1-1.html]

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

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

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; }
    }
}

5、运转此程序,开掘前后相继无法按自身想要的结果运转,出将来最前边现身的错误。


由此翻看出错的消息,开掘

AttachDBFilename=|DataDirectory|MusicDBContext.mdf

不平常,而那又是绝非难点的,那终归是怎么回事?为啥会现身谬误?

于是乎,通过MSDN查找有关资料,通过以下办法获得DataDirectory内定的路径是什么样:

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文件夹下。

只要原来的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 

2)假设是ASP.NET程序,DataDirectory的开首化目录为App_Data。

3)关于更加的多的|DataDirectory|知识,请参照他事他说加以考察如下:

     

     

     

   

 

编辑:编程知识 本文来源:有关DataDirectory的有的思忖,WinForm程序中两份md

关键词:

  • 上一篇:没有了
  • 下一篇:没有了