没有任何connectionString自动创建localdb?

时间:2013-06-25 20:30:50

标签: database entity-framework connection-string localdb

我正在按照这两个教程来了解EF的工作原理 http://msdn.microsoft.com/en-us/data/jj193542
http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

这两个教程之间存在差异:第一个教程说我不必在Web.config下创建一个connectionString,以便EF创建一个新数据库,但Scott Gu的教程说我需要。

我成功完成了第一个:

namespace LearnDB.Models
{
    public class Person
    {
        [Key]
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

namespace LearnDB.DAL
{
    public class DBAccess : DbContext
    {
        public DbSet<Person> Persons { get; set; }
    }
}

namespace LearnDB.Controllers
{
    public class HomeController : Controller
    {
        public string Index()
        {
            var db = new DBAccess();
            var p = new Person { Name = "A", Age = 1 };
            db.Persons.Add(p);
            db.SaveChanges();
            foreach (var per in db.Persons)
            {
                return per.Name;
            }
            return "hi";
        }
    }
}

此程序成功运行 但是,我想知道:
1.为什么我的程序没有添加任何connectionStrings就能成功?我想我必须加上
<add name="DBAccess" ...... /取代。如果没有必要,为什么Scott Gu说我应该添加它? 2.究竟是什么触发了数据库的自动创建?根据我的尝试,数据库不会在编译或创建DbContext时创建,而只会在添加到其中的某些数据上创建。这是对的吗?

1 个答案:

答案 0 :(得分:2)

如果您不覆盖或以其他方式指定实体框架,则实体框架会默认执行许多操作。这包括是否为您创建数据库,尝试执行此操作的位置以及它将如何解释您放入DBContext的类。

由于您什么都没做,答案是在您提供的第一个链接中给出的: http://msdn.microsoft.com/en-us/data/jj193542

转到:“我的数据在哪里?”

由于您没有做任何事情来覆盖或定义您想要的设置,EF将尝试为您创建一个数据库(如果不存在)。它说如果你安装了SQLExpress,它会尝试使用它,但如果没有,它将尝试使用LocalDB(这是一个更新,甚至更轻的版本,这对开发人员来说非常有利于最小化他们的开发足迹)。

Scott Guthrie的文章指出了另一个惯例。它将使用与DBContext类相同的特定连接字符串作为数据库的连接字符串。

但是,如果您不提供(您没有提供),请返回第一篇文章,他们说他们将命名他们创建的新数据库(在SQLExpress或LocalDB上): “数据库以派生上下文的完全限定名称命名。”

基本上,你所做的是获得成功所需的最少量。这不是一件坏事。这只是意味着所有惯例都很神秘。约定优于配置是一个很好的概念,但是当你甚至不知道为你设置的设置时,这绝对是令人生畏的!