Understand CreateDatabaseIfNotExists
本文关键字:CreateDatabaseIfNotExists Understand | 更新日期: 2023-09-27 17:58:46
假设我们有两个域类。
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=新的Blogging上下文())
它再次调用了构造函数,我不确定它是否正常。
您可以随意调用的构造函数
Database.SetInitializer<BloggingContext >(new CreateDatabaseIfNotExists<BloggingContext>());
CreateDatabaseIfNotExists
只是做一个DB检查,看看它是否真的存在,如果不存在,它会创建它,否则它会跳过数据库创建部分!
策略的名称实际上没有意义。实际上,CreateDatabaseIfNotExists策略的作用是:
- 检查具有指定名称的数据库是否存在,如果不存在它将创建一个新的数据库
- 如果具有指定名称的数据库已经存在,并且在数据库中根本找不到表/proc,这意味着数据库在"全新"状态下,策略也将生成数据库构造和插入种子数据
- 如果具有指定名称的数据库已经存在,并且数据库中的一些表/proc,则它将不起任何作用