我正在按照这两个教程来了解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时创建,而只会在添加到其中的某些数据上创建。这是对的吗?
答案 0 :(得分:2)
如果您不覆盖或以其他方式指定实体框架,则实体框架会默认执行许多操作。这包括是否为您创建数据库,尝试执行此操作的位置以及它将如何解释您放入DBContext的类。
由于您什么都没做,答案是在您提供的第一个链接中给出的: http://msdn.microsoft.com/en-us/data/jj193542
转到:“我的数据在哪里?”
由于您没有做任何事情来覆盖或定义您想要的设置,EF将尝试为您创建一个数据库(如果不存在)。它说如果你安装了SQLExpress,它会尝试使用它,但如果没有,它将尝试使用LocalDB(这是一个更新,甚至更轻的版本,这对开发人员来说非常有利于最小化他们的开发足迹)。
Scott Guthrie的文章指出了另一个惯例。它将使用与DBContext类相同的特定连接字符串作为数据库的连接字符串。但是,如果您不提供(您没有提供),请返回第一篇文章,他们说他们将命名他们创建的新数据库(在SQLExpress或LocalDB上): “数据库以派生上下文的完全限定名称命名。”
基本上,你所做的是获得成功所需的最少量。这不是一件坏事。这只是意味着所有惯例都很神秘。约定优于配置是一个很好的概念,但是当你甚至不知道为你设置的设置时,这绝对是令人生畏的!