在实际项目中,经常需要数据添加的时候 能够直接copy 有的数据 稍微做一些修改就可以完成新的数据使用。
那么copy功能如何 实现?
其实非常简单:分为俩个部分
1:被复制的源数据查询出来(根据id) 2:将内容进行添加 (只需要将一些不能相同的列如code id这些稍微改动一下)
操作: 查找数据源
将一些需要的表数据查出来 代理属性关闭也是ok的
public TourPackage GetCopyPackageByPackageId(int id)
{
//DbContext.Configuration.ProxyCreationEnabled = false;
var package = DbContext.TourPackageList
.Include(t => t.DealTypes)
.Include(t => t.TourPackageAirlines)
.Include(t => t.TourPackageRoutings)
.Include(t => t.TourPackagePromotions)
.Include("TourPackageItineraries.ItineraryFeatureHotelList")
.Include("TourPackageItineraries.ItineraryOptionaTourlList")
.Include("TourPackageItineraries.ItineraryMealList")
.AsNoTracking().FirstOrDefault(t => t.Id == id);
//DbContext.Configuration.ProxyCreationEnabled = true;
return package;
}
自己想测试一下 不去inclued 直接 将主表查的时候 用导航延迟属性直接带出来 直接 add岂不是更快
public TourPackage GetCopyPackageByPackageIds(int id)
{
var package = DbContext.TourPackageList
.AsNoTracking().FirstOrDefault(t => t.Id == id);
return package;
}
但是发现如果不调试进行操作会出现 从表数据丢失的情况
解析:虽然使用了导航属性 但是从表对象 只有使用过一次 才会被数据库所知道,一次没使用 跟没有是一样的
public TourPackage GetCopyPackageByPackageIds(int id)
{
var package = DbContext.TourPackageList.AsNoTracking().SingleOrDefault(t => t.Id == id);
var a = package.TourPackageItineraries; //需要点一下这个从表属性 让数据库知道有这个带出来的数据要用
var b = package.TourPackageSeries; //所以说定义一个对象 只是为了说明一下我这个对象要用带出来一下让数据库识别
return package;
}
查出数据源之后就好办了 直接 add 这个对象 需要的内容都有了
public Boolean CopyPackage(TourPackage package)
{
bool isSuccess=false;
if (package == null) return isSuccess;
using (var trans = DbContext.Database.BeginTransaction())
{
try
{
DbContext.TourPackageList.Add(package);
DbContext.SaveChanges();
trans.Commit();
isSuccess = true;
}
catch (Exception e)
{
isSuccess = false;
trans.Rollback();
}
}
return isSuccess;
}