EF 增删改查

db.SaveChanges()  保存数据库是根据 实体状态来的

实体状态一共有五种:

  1. Detached  分离
  2. Unchanged   未改变
  3. Added   添加
  4. Deleted  删除 
  5. 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();

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值