1

我正在关注这两个教程以了解 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为 EF 创建一个 connectionString 来创建新数据库,但 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. 为什么我的程序没有添加任何连接字符串就成功了?我想我必须添加
<add name="DBAccess" ....../>。如果没有必要,为什么 Scott Gu 说我应该添加它?
2.究竟是什么触发了数据库的自动创建?根据我的尝试,不会在编译或创建 DbContext 时创建数据库,而只会在添加一些数据时创建数据库。这个对吗?

4

1 回答 1

2

如果您不覆盖或以其他方式指定它,实体框架具有默认情况下会执行许多操作的约定。这包括是否会为您创建数据库、它将尝试在哪里执行此操作以及它将如何解释您放入 DBContext 的类等所有内容。

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

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

由于您没有做任何事情来覆盖或定义您想要的设置,EF 将尝试为您创建一个数据库(如果不存在)。它说如果您安装了 SQLExpress,它将尝试使用它,但如果没有,它将尝试使用 LocalDB(这是一个更新的更轻量级的版本,非常适合开发人员最大限度地减少他们的开发足迹)。

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

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

基本上,你所做的只是让事情顺利进行所需的最少数量。这不是一件坏事。这只是意味着所有约定可能是神秘的。约定优于配置是一个不错的概念,但是当您甚至不知道正在为您设置的设置是什么时,这绝对是令人生畏的!

于 2013-07-23T20:02:21.337 回答