1、自定义数据库链接字符串上下文
public class PetDbContext : DbContext { public PetDbContext() : base("name=DemoDB") { } public DbSet<Dog> Dogs { get; set; } }
2、Code First 模型迁移相关命令
Enable-Migrations 启用模型迁移,会自动建立Migrations文件夹,里面记录模型修改历史 Add-Migration AddType ,模型添加字段Type后,执行该命令,会生成模型修改历史 Update-Database 将模型的修改应用到数据库中
3、EF 支持的完整注释列表为
- KeyAttribute
- StringLengthAttribute
- MaxLengthAttribute
- ConcurrencyCheckAttribute
- RequiredAttribute
- TimestampAttribute
- ComplexTypeAttribute
- ColumnAttribute
- TableAttribute
- InversePropertyAttribute
- ForeignKeyAttribute
- DatabaseGeneratedAttribute
- NotMappedAttribute
4、Entity Framework数据库初始化方式
Entity Framework通过Database.SetInitializer来指定需要的数据库初始化方式,Database.SetInitializer可指定的数据库共有3种: 1>. CreateDatabaseIfNotExists CreateDatabaseIfNotExists是Database.SetInitializer指定数据库的默认方式,用于当数据库不存在时,自动创建数据库。由于该方式是默认方式,所以可以不需要任何代码进行指定,当然也可以使用代码来明确的指定。 Database.SetInitializer(new CreateDatabaseIfNotExists<PetDbContext>()); 2>. DropCreateDatabaseWhenModelChanges DropCreateDatabaseWhenModelChanges用于当数据模型发生改变时,先删除原数据库,后创建新的数据库。 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PetDbContext>()); 3>. DropCreateDatabaseAlways DropCreateDatabaseAlways用于每次均先删除原数据库再创建新的数据库,不管数据模型是否发生改变。 Database.SetInitializer(new DropCreateDatabaseAlways<PetDbContext>()); 但是,在很多时候,我们希望即使在Entity Framework Code First与数据库不匹配时,宁可Entity Framework Code First报出数据库连接错误,而不希望对数据库进行任何的删除创建操作。Entity Framework Code First提供关闭数据库初始化操作: Database.SetInitializer<PetDbContext>(null);
代码示例:
public class PetDbContext : DbContext { static PetDbContext() { Database.SetInitializer<PetDbContext>(null); //Database.SetInitializer(new CreateDatabaseIfNotExists<PetDbContext>()); //Database.SetInitializer(new DropCreateDatabaseAlways<PetDbContext>()); //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PetDbContext>()); } public PetDbContext() : base("name=DemoDB") { } public DbSet<Dog> Dogs { get; set; } }
5、使用ER进行CRUD操作
实体定义
public class Dog { public int? Age { get; set; } public Guid Id { get; set; } public string Name { get; set; } public float? Weight { get; set; } public int Type { get; set; } public DateTime BirthDay { get; set; } public string Address { get; set; } }
新增:
using (PetDbContext db = new PetDbContext()) {
var dog = new Dog { Id = Guid.NewGuid(), Name = "杨贵妃", Age = 4,Type=6,BirthDay=DateTime.Now };
db.Dogs.Add(dog); int cnt = db.SaveChanges();
}
根据ID读取与更新:
using (PetDbContext db = new PetDbContext())
{
var dog = db.Dogs.FirstOrDefault<Dog>(t =>( t.Id == new Guid("3455dcc0-4487-4258-bd76-b158c1c4a551")));
if(dog!=null)
{
dog.BirthDay = DateTime.Now;
int cnt = db.SaveChanges();
}
}
删除记录:
using (PetDbContext db = new PetDbContext()) { var dog = db.Dogs.FirstOrDefault<Dog>(t =>( t.Id == new Guid("3455dcc0-4487-4258-bd76-b158c1c4a551"))); if(dog!=null)
{ db.Dogs.Remove(dog); int cnt = db.SaveChanges();
} }
6、多表连接查询示例:
var list2 = from a in dbContext.Student join b in dbContext.Course on a.Id equals b.StudentId where a.Id == 1 select new { a.Name, a.Sex, a.Aage, b.CourseName }; gridView.DataSource = list2.ToList(); gridView.DataBind();
7、使用EF进行批量更新的框架:
https://github.com/loresoft/EntityFramework.Extended
8、Linq中使用like
Linq 还提供了一种方法,叫做SqlMethods.Like,需要先添加System.Data.Linq.SqlClient名称空间。上面的三个可以写成 var q = (from c in db.Customers where SqlMethods.Like(c.CustomerID, "%ROUT%")
9、存储过程 删除,有几个参数,存储后面要带几个参数以逗号分隔
SqlParameter[] para = new SqlParameter[] { new SqlParameter("@ID",id) }; db.Database.ExecuteSqlCommand("sp_Userinfos_deleteByID @ID", para);
10、出现Unable to load the specified metadata resource.
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
改为
connectionString="metadata=res://*/;
https://msdn.microsoft.com/en-us/data/jj200620
https://msdn.microsoft.com/zh-cn/data/ee712907