EntityFramework教程詳解
應用程序?qū)?shù)據(jù)庫執(zhí)行CRUD時,通過entity framework方式,實際上是對DbContext的操作,DbContext是EF的入口,DbContext拿到對應的消息(CRUD)后,通過ORM中的Mapping來將對象O映射成數(shù)據(jù)庫中的關系R。
EntityFramework中進行修改、刪除、增加數(shù)據(jù),都需要將要操作的數(shù)據(jù)先添加到“上下文”中,并修改上下文的狀態(tài),最后調(diào)用SaveChange這個方法。而查詢可以利用Linq語句查詢或者利用lambda表達式去查詢。
增加對象
DbEntity db = new DbEntity(); //創(chuàng)建對象實體,注意,這里需要對所有屬性進行賦值(除了自動增長主鍵外),如果不賦值,則會數(shù)據(jù)庫中會被設置為NULL(注意是否可空)
var user = new User { Name = "bomo", Age = 21, Gender = "male" };
db.User.Add(user);
db.SaveChanges();
var entity = Mapper.Map<CreateServerInDto, SysServer>(model);
entity.ServerId = DbHepler.GenerateNewId();
db.SysServers.Add(entity);
db.SaveChanges();
刪除對象,刪除只需要對象的主鍵
DbEntity db = new DbEntity();
//刪除只需要主鍵,這里刪除主鍵為5的行
var user = new User {Id = 5};
//將實體附加到對象管理器中
db.User.Attach(user);
//方法一:
db.User.Remove(user);
//方法二:把當前實體的狀態(tài)改為刪除
//db.Entry(user).State = EntityState.Deleted;
db.SaveChanges();
var entity = db.SysServers.FirstOrDefault(p => p.ServerId == serverId);
if (entity == null)
return GetErrorMsgByErrCode(20101005);
db.SysServers.Remove(entity);
db.SaveChanges();
修改對象
方法一
DbEntity db = new DbEntity();
//修改需要對主鍵賦值,注意:這里需要對所有字段賦值,沒有賦值的字段會用NULL更新到數(shù)據(jù)庫
var user = new User
{
Id = 5,
Name = "bomo",
Age = 21,
Gender = "male"
};
//將實體附加到對象管理器中
db.User.Attach(user);
//把當前實體的狀態(tài)改為Modified
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
var entity = Mapper.Map<UpdateServerInDto, SysServer>(model);
db.SysServers.Attach(entity);
db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
方法二:方法一中每次都需要對所有字段進行修改,效率低,而且麻煩,下面介紹修改部分字段
DbEntity db = new DbEntity();
//修改需要對主鍵賦值,注意:這里需要對所有字段賦值,沒有賦值的字段會用NULL更新到數(shù)據(jù)庫
var user = new User
{
Id = 5,
Name = "bomo",
Age = 21
};
//將實體附加到對象管理器中
db.User.Attach(user);
//獲取到user的狀態(tài)實體,可以修改其狀態(tài)
var setEntry = ((IObjectContextAdapter) db).ObjectContext.ObjectStateManager.GetObjectStateEntry(user);
//只修改實體的Name屬性和Age屬性
setEntry.SetModifiedProperty("Name");
setEntry.SetModifiedProperty("Age");
db.SaveChanges();
使用事務
使用事務很簡單,只要把需要的操作放在 TransactionScope 中,最后提交
DbEntity db = new DbEntity();
using (var scope = new TransactionScope())
{
//執(zhí)行多個操作
var user1 = new User
{
Name = "bomo",
Age = 21,
Gender = "male"
};
db.User.Add(user1);
db.SaveChanges();
var user2 = new User
{
Name = "toroto",
Age = 20,
Gender = "female"
};
db.User.Add(user2);
db.SaveChanges();
//提交事務
scope.Complete();
}
查詢:查詢通過LinQ查詢
DbEntity db = new DbEntity();
//選擇部分字段
var user = db.User.Where(u => u.Name == "bomo").Select(u => new {Id = u.Id, Name = u.Name, Age = u.Age}).FirstOrDefault();
//只有調(diào)用了FirstOrDefault, First, Single, ToList, ToArray等函數(shù)才會執(zhí)行對數(shù)據(jù)庫的查詢