db.SaveChanges() 保存数据库是根据 实体状态来的
实体状态一共有五种:
- Detached 分离
- Unchanged 未改变
- Added 添加
- Deleted 删除
- Modified 修改
SaveChanges()的时候是怎么知道是那种实体状态呢?
1:要不就是方法里面标识了状态 2:要不就是声名状态
AsNotracking()方法 变成分离状态 Attach 变成 Unchanged状态
通过调用 Remove 或者是 RemoveRange 方法 变成 deleted 状态
通过 Add 方法调用 变成 Added 状态
声名状态
db.Entry(user).State = EntityState.Added;
db.Entry(user).State = EntityState.Deleted;
db.Entry(user).State = EntityState.Modified;
db.Entry(mod).Property(t => t.GrandTotal).IsModified = true; //某列改 直接写这个 上面那个表修改就不用了
增删改的操作全都都是对于 实体model
增加的话
以主表为基准,每个属性值匹配对应,每个从表的导航属性对应处理转化好的实体对象
直接添加主表即可 savechange
修改的话
从主表开始修改,先查id查出FirstOrDefault唯一数据,然后改
然后是从表开始修改,如果是从表id不变只更改某个属性的话,则根据id查出,然后修改
如果是没有id的话,添加
如果从表的内容变化,需要删除之前的然后添加现有的,那就先删除再添加
最好是删除和修改的按钮各干各的,这样的话修改的时候就根据id判断添加或修改
删除就是直接根据id删除
级联删除的话设置 构造器中设置或者数据库中设置 外键修改然后在insert and update那一栏中设置删除规则Cascade
举例:
//添加数据 把主表 从表 在控制器中json反序列化对象后 直接添加
public bool AddPrivateTours(PrivateTour PrivateTours,List<PrivateTour_placelist> PrivateTour_placelist)
{
//添加主表从表数据
PrivateTours.PrivateTour_placelists = PrivateTour_placelist;
dbContext.PrivateToursList.Add(PrivateTours);
dbContext.SaveChanges();
return true;
}
//删除privatetour 把id传过来 删除
public bool DeletePrivateTourById(int Id, string opname)
{
bool flag = false;
var PrivateTour = dbContext.PrivateToursList.FirstOrDefault(a => a.Id ==Id);
if (PrivateTour!=null)
{
dbContext.PrivateToursList.Remove(PrivateTour);
dbContext.SaveChanges();
flag = true;
}
//增加日志
string logcontent = "";
logcontent = "Delete user name: " + PrivateTour.Name + " user email: " + PrivateTour.Email+" privateid: "+Id;
new LogInfoDal().SetLog(dbContext, opname, "PrivateTour", OPType.Delete.ToString(), logcontent);
return flag;
}
//修改 如果是从表集合改变 是先删除从表的内容 在添加现在的内容 如果是主表改的话就直接改
List<TourPackage_Itinerary_Meal> mealList = dbContext.TourPackage_ItineraryMealList.Where(a => a.ItineraryId == mod.Id).ToList();
if (mealList != null && mealList.Count > 0)
{
foreach (var meal in mealList)
{
dbContext.TourPackage_ItineraryMealList.Remove(meal);
Content = "Delete Itinerary Meals: Id:" + meal.Id + " PackageName:" + name + " PackageCode:" + code+" ItineraryId:" + meal.ItineraryId + " MealCode:" + meal.MealCode;
new LogInfoDal().SetLog(dbContext, opname, "PackageItineraryMeals", OPType.Delete.ToString(), Content);
}
}
foreach (var meal in mod.itineraryMealList)
{
dbContext.TourPackage_ItineraryMealList.Add(meal);
Content = "Add Itinerary Meals: ItineraryId:" + meal.ItineraryId + " PackageName:" + name + " PackageCode:" + code + " MealCode:" + meal.MealCode;
new LogInfoDal().SetLog(dbContext, opname, "PackageItineraryMeals", OPType.Add.ToString(), Content);
}
dbContext.SaveChanges();
//修改 添加 结合版
public bool TourPackage_AddorUpSpecialLIst(string Planid,string title, bool active, List<TourPackage_PlanRlationTour> PlanRlationTour, List<TourPackage_SpecialInventoryData> list)
{
if (Planid != null && Planid != "")
{
int planid = Convert.ToInt32(Planid);
//说明有id计划 那就是详情信息处理更新
//主表更新 修改
var u = dbContext.TourPackageSpecialInventoryList.Where(e => e.PlanId == planid).FirstOrDefault();
u.Title = title;
u.Active = active;
//从表 出发相关信息list更新 修改 添加
foreach (var item in list)
{
if (item.Id != 0)
{
//从表主键id存在 表明要更新此条数据 先查询 在更新 更新设置的新库存
var p = dbContext.TourPackageSpecialInventoryDataList.Where(e => e.Id == item.Id).FirstOrDefault();
p.TotalRoomInventory = item.TotalRoomInventory;
}
else
{
//从表添加此数据
TourPackage_SpecialInventoryData savedata = new TourPackage_SpecialInventoryData
{
RelationPlanId = planid,
Airline = item.Airline,
Gateway = item.Gateway,
PackageDate = item.PackageDate,
TotalRoomInventory = item.TotalRoomInventory
};
dbContext.TourPackageSpecialInventoryDataList.Add(savedata);
}
}
//从表 计划团关联 先删除所有的团
var palist=dbContext.TourPackagePlanRlationTourList.Where(t => t.RelationPlanId == planid).ToList();
foreach (var item in palist)
{
dbContext.TourPackagePlanRlationTourList.Remove(item);
}
//然后重新添加关系以及 现在的团信息
foreach (var item in PlanRlationTour)
{
TourPackage_PlanRlationTour save = new TourPackage_PlanRlationTour
{
PackageCode = item.PackageCode,
RelationPlanId = planid,
PackageId = item.PackageId,
};
dbContext.TourPackagePlanRlationTourList.Add(save);
}
dbContext.SaveChanges();
}
//简便删除写法
先删除再添加 DealType
DbContext.OptionalTourDealTypes.RemoveRange(
DbContext.OptionalTourDealTypes.Where(d => d.OptionalTourId == mod.OptionalTourId));
foreach (var dealType in mod.optionalDealTypes)
{
DbContext.OptionalTourDealTypes.Add(dealType);
}
DbContext.SaveChanges();
else
{
//添加主表从表数据
TourPackage_SpecialInventory SaveDate = new TourPackage_SpecialInventory
{
Active = active,
SpecialInventoryData = list,
Title = title,
TourPackagePlanTour = PlanRlationTour,
};
dbContext.TourPackageSpecialInventoryList.Add(SaveDate);
dbContext.SaveChanges();
}
return true;
}
修改特别说明 :
有时候 修改的表 可能是主表 他本身里面会加载从表的一些数据 如果这个时候去改主表的一些内容 ,可能从表有些字段不为空会影响主表改。所以就需要new 一个对象出来,然后attach 然后更改modify状态 说明要改的列 和id
CodeFirstContext context = new CodeFirstContext();
TUsers user = new TUsers();
user.UserId = 1;
user.Account = "1231";
context.Users.Attach(user);//实体状态变为unchange
//更改状态为modified
context.Entry(user).State = System.Data.Entity.EntityState.Modified;
//说明要改的列
context.Entry(user).Property("CreateDate").IsModified = false; //不改的列 也可以不说明 只改的列说明一下
context.Entry(user).Property("Account").IsModified = true;//改的列
context.SaveChanges();
修改没有什么特别的关系影响 就只是单张表修改的话,直接查出来 给对应的值进行修改就行了。
CodeFirstContext context = new CodeFirstContext();
TUsers user = context.Users.Where(d => d.UserId == 1).FirstOrDefault<TUsers>();
user.Account = "administrator";
context.SaveChanges();