一、数据库初始化策略
数据库初始化有4种策略
策略一:数据库不存在时重新创建数据库
Database.SetInitializer<EFCodeFirstDbContext>(new CreateDatabaseIfNotExists<EFCodeFirstDbContext>());
策略二:每次启动应用程序时创建数据库
Database.SetInitializer<EFCodeFirstDbContext>(new DropCreateDatabaseAlways<EFCodeFirstDbContext>());
策略三:模型更改时重新创建数据库
Database.SetInitializer<EFCodeFirstDbContext>(new DropCreateDatabaseIfModelChanges<EFCodeFirstDbContext>());
策略四:从不创建数据库
Database.SetInitializer<EFCodeFirstDbContext>(null);
二、执行SQL语句
有时候在code first中也会执行sql来做查询,或者是查询视图。
using (var db = new StudentDbContext())
{
List<Person> persons = db.Database.SqlQuery<Person>("select * from Person where personId=@id", new SqlParameter("@id", "1000")).ToList();
foreach (var person in persons)
{
Console.WriteLine("{0} {1} {2} {3}", person.PersonId, person.Name, person.Age, person.Sex);
}
}
Console.ReadLine();
查询结果如下图所示:
上面的例子中Person是一个表,查询视图的方法与之相同。
三、执行存储过程
有时候使用sql能解决的问题使用ef就不那么简单,比如查找树的某个节点的所有父节点或所有子节点。而这种情况如果使用存储过程就会很简单。
下面是一个简单的存储过程:
CREATE PROCEDURE TestProcedure
@personId nvarchar(100)
AS
BEGIN
select * from Person where PersonId=@personId;
END
GO
下面EF执行存储过程:
List<Person> persons = db.Database.SqlQuery<Person>("TestProcedure @personId", new SqlParameter("@personId", "1000")).ToList();
foreach (var person in persons)
{
Console.WriteLine("{0} {1} {2} {3}",person.PersonId,person.Name,person.Age,person.Sex);
}
执行结果如下图所示:
上面的都是查询使用的都是SqlQuery,如果需要更新操作可以使用ExecuteSqlCommand方法。
int count = db.Database.ExecuteSqlCommand("update Person set Name=@name where PersonId=@personId", new[] { new SqlParameter("@name", "李四"), new SqlParameter("@personId", "1000") });
Console.WriteLine(count);
执行结果如下图所示:
打开数据库,查看执行结果如下图所示:
从上面截图可以看到已经将personId=1000的Name改为李四,之前都是王二。