【问题标题】:Insert new rows based on date in Entity framework在实体框架中根据日期插入新行
【发布时间】:2014-07-17 13:03:49
【问题描述】:

我收到了一个使用实体框架的应用程序。我不熟悉实体,我遇到了一个我无法弄清楚的问题。此应用程序用于将数据从数据库迁移到关系更密切的数据库。在初始迁移之后,我们必须再次运行它以插入不属于原始迁移的其他行。 (有 3 周的间隔)。我知道我必须签入,我想通过我们使用的名为“DateChanged”的列之一来执行此操作,但不幸的是我不确定如何在实体中执行此操作。这是我的第一次尝试,它只是显示为令人沮丧的红色。我在互联网上搜索过,但没有找到解决方案。

 if (!newData.tVehicleLogs.Any(v => v.DateChanged.Value.ToShortDateString("6/27/2014")))//I'm not sure how to check the DateChanged here.
 {
      newData.tVehicleLogs.Add(deal);
      comment = new tVehicleComment
      {
         Comment = vehicle.Reason,
         DealID = deal.DealID,
         CurrentComment = false
       };
       newData.tVehicleComments.Add(comment);

       newData.SaveChanges();
       int cId = comment.CommentID;
       deal.CommentID = cId;
       }
  }

如您所见,我正在尝试使用 if 语句检查日期,但我无法获得正确的语法...在尝试了我所知道的一切尝试之后...目前还不算多.

我基本上需要检查 DateChanged 是否是从 2014 年 6 月 27 日到今天的日期。如果是在此之前,那么它已经被迁移过来,不需要再次迁移。在它说注释的地方,如果该行是新的,那么它将旧注释插入到新的 cmets 表中,然后使用 commentID 更新 tVehicleLogs 表。我只是停留在日期检查部分。非常感谢任何帮助!

编辑:这是插入 tVehicleLogs 的完整代码..

if (MigrateLogs)
{
    List<VLog> vlog = oldData.VLogs.ToList();

    foreach (VLog vehicle in vlog)
    {

       tBank bank;
       tCustomer cust;
       tFIManager manag;
       tSalesPerson sales;
       tMake make;
       tModel model;
       tDealership dealership;
       tMakeDealership makedeal;
       tVehicleComment comment;
       tInternalLocation location;

       string dealershipName = getProperDealershipName(vehicle.Dealership, newData);

       bank = (newData.tBanks.Any(banks => banks.BankName == vehicle.BankName) ? newData.tBanks.Where(b => b.BankName == vehicle.BankName).FirstOrDefault() : newData.tBanks.Add(new tBank { BankName = vehicle.BankName }));

       cust = (newData.tCustomers.Any(customer => customer.CustomerNumber == vehicle.CustNumber) ? newData.tCustomers.Where(customer => customer.CustomerNumber == vehicle.CustNumber).FirstOrDefault() : newData.tCustomers.Add(new tCustomer { CustomerNumber = vehicle.CustNumber, CustomerName = vehicle.Buyer }));
                //cust = (newData.tCustomers.Any(customer => customer.CustomerNumber == vehicle.CustNumber && customer.CustomerName == vehicle.CustNumber) ? newData.tCustomers.Where(customer => customer.CustomerNumber == vehicle.CustNumber).FirstOrDefault() : newData.tCustomers.Add(new tCustomer { CustomerNumber = vehicle.CustNumber, CustomerName = vehicle.Buyer }));

       manag = (newData.tFIManagers.Any(manager => manager.FIName == vehicle.FIName) ? newData.tFIManagers.Where(manager => manager.FIName == vehicle.FIName).FirstOrDefault() : newData.tFIManagers.Add(new tFIManager { FIName = vehicle.FIName }));

       sales = (newData.tSalesPersons.Any(person => person.SalesPersonNumber == vehicle.SalesPerson) ? newData.tSalesPersons.Where(person => person.SalesPersonNumber == vehicle.SalesPerson).FirstOrDefault() : newData.tSalesPersons.Add(new tSalesPerson { SalesPersonNumber = vehicle.SalesPerson }));

       make = (newData.tMakes.Any(m => m.Make == vehicle.Make) ? newData.tMakes.Where(m => m.Make == vehicle.Make).FirstOrDefault() : newData.tMakes.Add(new tMake { Make = vehicle.Make }));

       model = (newData.tModels.Any(m => m.Model == vehicle.Model) ? newData.tModels.Where(m => m.Model == vehicle.Model).FirstOrDefault() : newData.tModels.Add(new tModel { Model = vehicle.Model, MakeID = make.MakeID }));

       dealership = (newData.tDealerships.Any(d => d.DealershipName == dealershipName) ? newData.tDealerships.Where(d => d.DealershipName == dealershipName).FirstOrDefault() : newData.tDealerships.Add(new tDealership { DealershipName = dealershipName }));

       makedeal = (newData.tMakeDealerships.Any(d => d.MakeID == make.MakeID && d.DealershipID == dealership.DealershipID) ? newData.tMakeDealerships.Where(d => d.MakeID == make.MakeID && d.DealershipID == dealership.DealershipID).FirstOrDefault() : newData.tMakeDealerships.Add(new tMakeDealership { DealershipID = dealership.DealershipID, MakeID = make.MakeID }));

       location = (newData.tInternalLocations.Any(l => l.LocationName == vehicle.Location) ? newData.tInternalLocations.Where(l => l.LocationName == vehicle.Location).FirstOrDefault() : newData.tInternalLocations.Add(new tInternalLocation { LocationName = vehicle.Location }));

       //log = (newData.tVehicleLogs.Any(l => l.DealNumber == vehicle.FIMAST &&) ? newData.tVehicleLogs.Where(l => l.DealNumber == vehicle.FIMAST).FirstOrDefault() : newData.tVehicleLogs.Add(new tVehicleLog {DealNumber = vehicle.FIMAST }));

       Int32 stat;
       int? status;

       if (Int32.TryParse(vehicle.Status, out stat))
           status = stat;
       else
           status = null;

       DateTime titled, bounced, dateReceived;
       bool trueTitled = DateTime.TryParse(vehicle.Titled, out titled);
       bool trueBounced = DateTime.TryParse(vehicle.Bounced, out bounced);
       bool trueReceived = DateTime.TryParse(vehicle.DateReceived, out dateReceived);

       int dealid = newData.tVehicleDeals.Where(v => v.DealNumber == vehicle.FIMAST).FirstOrDefault().DealID;

       tVehicleLog deal = new tVehicleLog
       {
          DealNumber = vehicle.FIMAST,
          StockNumber = vehicle.StockNumber,
          BankID = bank.BankID,
          CustomerID = cust.CustomerID,
          FIManagerID = manag.FIManagerID,
          SalesPersonID = sales.SalesPersonID,
          VINNumber = null,
          DealDate = vehicle.DealDate,
          NewUsed = vehicle.NewUsed,
          GrossProfit = vehicle.GrossProfit,
          AmtFinanced = vehicle.AmtFinanced,
          CloseDate = null,
          Category = vehicle.RetailLease,
          Status = status,
          DealershipID = dealership.DealershipID,
          NewDeal = false,
          Archived = false,
          InternalLocationID = location.InternalLocationID,
          ChangedBy = vehicle.ChangedBy,
          DateChanged = DateTime.Parse(vehicle.DateChanged),
          Titled = null,
          Bounced = null,
          MakeID = make.MakeID,
          ModelID = model.ModelID,
          DealID = dealid,
          CommentID = null
       };

       if (trueTitled)
           deal.Titled = titled;

       if (trueBounced)
           deal.Bounced = bounced;

       if (trueReceived)
           deal.DateReceived = dateReceived;

       DateTime targetDate = new DateTime(2014, 06, 27);

       //if(!newData.tVehicleLogs.Any(v => v.DateChanged >= targetDate))
       if(deal.DateChanged >= targetDate && !newData.tVehicleLogs.Any(v => v.DateChanged >= targetDate))
                {
           newData.tVehicleLogs.Add(deal);
           comment = new tVehicleComment
           {
               Comment = vehicle.Reason,
               DealID = deal.DealID,
               CurrentComment = false
            };
            newData.tVehicleComments.Add(comment);
            newData.SaveChanges();
            int cId = comment.CommentID;
            deal.CommentID = cId;
         }
     }
 }

【问题讨论】:

  • 您使用的是“迁移”一词,但您不是在谈论EF Code first migrations,是吗?
  • 不,我不认为我是。两个数据库都已经存在。我们只是将数据从旧数据库“迁移”到新的、关系更密切的数据库。

标签: c# asp.net sql entity-framework


【解决方案1】:

我认为您不需要在此处使用 linq(前提是您已将对象拉下)。只需检查日期。

// pull down the object
var deal = newData.tVehicleLogs.Where(v => v.Id == SOMEID).FirstOrDefault();

DateTime targetDate = new DateTime(2014,06,27);
if (tVehicleLogs.DateChaned <= DateTime.Now 
    && tVehicleLogs.DateChaned >= targetDate) {
}

或者,下拉所有满足日期条件的对象并遍历它们。

List<YourObject> list = newData.tVehicleLogs.Where(v => v.DateChanged <= DateTime.Now
&& v.DateChanged >= targetDate).ToList();
foreach(var l in list) {
    // do your stuff here
}

【讨论】:

  • 我试了一下,但是 newData.tVehicleLogs 没有列名,所以很遗憾 newData.tVehicleLogs.DateChanged 不起作用。
  • @Humpy 你是说数据库中的 DateChanged 字段在你的代码中的 VehicleLogs 类中没有对应的属性吗?
  • 那么,DateChanged 不是 tVehicleLogs 的属性吗? @JeremyCook,打败我;)
  • tVehicleLogs 确实有 DataChanged。但是,我可以看到日期更改的唯一方法是执行 Linq .. 所以 newData.tVehicleLogs.Any(v => v.DateChanged ....))
  • 哦。因此,newData 是您的 EF 模型。我稍后会更新我的示例。
猜你喜欢
  • 2014-05-04
  • 1970-01-01
  • 2017-02-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多