了解CreateDatabaseIfNotExists

时间:2014-04-17 20:18:28

标签: c# .net entity-framework

假设我们有两个域类。

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
}

现在让我们创建一个上下文。

public class BloggingContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
}

    public BloggingContext () : base("Blogging")
    {
        Database.SetInitializer<BloggingContext >(new CreateDatabaseIfNotExists<BloggingContext>());
    }

同样在这个课程中,我们想要添加一些测试数据来验证它。

    public void AddBlog(params)
    {
        using (BloggingContext db = new BloggingContext ())
        {
            var t = new Blog { Name =name };
            db.Blogs.Add(t);
            try
            {
                db.SaveChanges();
                return true;
            }

然后为了测试它,我们创建了一个单元测试项目。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        BloggingContext bloging= new BloggingContext ();

        List<Post> post = new List<Post>();
        Post objPost = new Post();
        objPost.Post = "some";
        objPost.OtherFields = "test"; 
        // etc;
        post.Add(objPost); 
        bloging.AddBlog("MyBlog",post);

为了运行测试,我发现代码首先进入了BloggingContext类的构造函数,因此执行了Database.SetInitializer...

然后

  

使用(BloggingContext db = new BloggingContext())

它再次调用了构造函数,我不确定它是否正常。

2 个答案:

答案 0 :(得分:0)

您可以多次调用构造函数

Database.SetInitializer<BloggingContext >(new CreateDatabaseIfNotExists<BloggingContext>());

CreateDatabaseIfNotExists只是检查数据库是否确实存在,如果不存在则创建它,否则它会跳过数据库创建部分!

答案 1 :(得分:0)

策略的名称并没有多大意义。 实际上,CreateDatabaseIfNotExists策略的作用是:

  1. 检查是否存在具有指定名称的数据库,如果不存在 它将创建一个新数据库
  2. 如果已存在具有指定名称的数据库,则为 在db中根本没有找到表/ proc,这意味着db是 in&#34;新鲜的&#34;状态,那么策略也会生成db 结构和插入种子数据
  3. 如果具有指定名称的数据库已存在且存在 db中的一些表/ proc然后它什么都不做