Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么EF upsert逻辑会导致删除而不是更新?_C#_Entity Framework - Fatal编程技术网

C# 为什么EF upsert逻辑会导致删除而不是更新?

C# 为什么EF upsert逻辑会导致删除而不是更新?,c#,entity-framework,C#,Entity Framework,以下代码导致删除而不是更新 我的问题是:这是我针对实体框架编写代码的方式中的一个bug,还是我应该怀疑其他什么 更新:我已经完成了这项工作,但我现在把问题留给了原始版本和工作版本,希望我能学到一些我对EF不了解的东西 在这种情况下,原始的非工作的代码,当数据库是新的时,所有SearchDailySummary对象的添加都成功了,但是在第二次通过时,当我的代码假定要执行更新时,净结果是数据库中再次出现一个空表,也就是说,该逻辑相当于删除每个实体 //Logger.Info("Upserti

以下代码导致删除而不是更新

我的问题是:这是我针对实体框架编写代码的方式中的一个bug,还是我应该怀疑其他什么

更新:我已经完成了这项工作,但我现在把问题留给了原始版本和工作版本,希望我能学到一些我对EF不了解的东西

在这种情况下,原始的非工作的代码,当数据库是新的时,所有SearchDailySummary对象的添加都成功了,但是在第二次通过时,当我的代码假定要执行更新时,净结果是数据库中再次出现一个空表,也就是说,该逻辑相当于删除每个实体

    //Logger.Info("Upserting SearchDailySummaries..");
    using (var db = new ClientPortalContext())
    {
        foreach (var item in items)
        {
            var campaignName = item["campaign"];

            var pk1 = db.SearchCampaigns.Single(c => c.SearchCampaignName == campaignName).SearchCampaignId;
            var pk2 = DateTime.Parse(item["day"].Replace('-', '/'));

            var source = new SearchDailySummary
            {
                SearchCampaignId = pk1,
                Date = pk2,
                Revenue = decimal.Parse(item["totalConvValue"]),
                Cost = decimal.Parse(item["cost"]),
                Orders = int.Parse(item["conv1PerClick"]),
                Clicks = int.Parse(item["clicks"]),
                Impressions = int.Parse(item["impressions"]),
                CurrencyId = item["currency"] == "USD" ? 1 : -1 // NOTE: non USD (if exists) -1 for now
            };

            var target = db.Set<SearchDailySummary>().Find(pk1, pk2) ?? new SearchDailySummary();
            if (db.Entry(target).State == EntityState.Detached)
            {
                db.SearchDailySummaries.Add(target);
                addedCount++;
            }
            else
            {
                // TODO?: compare source and target and change the entity state to unchanged if no diff
                updatedCount++;
            }

            AutoMapper.Mapper.Map(source, target);

            itemCount++;
        }

        Logger.Info("Saving {0} SearchDailySummaries ({1} updates, {2} additions)", itemCount, updatedCount, addedCount);
        db.SaveChanges();
    }
//Logger.Info(“升级SearchDailySummaries…”);
使用(var db=new ClientPortalContext())
{
foreach(项目中的var项目)
{
var活动名称=项目[“活动”];
var pk1=db.SearchCampaigns.Single(c=>c.SearchCampaignName==campaignName).SearchCampaignId;
var pk2=DateTime.Parse(item[“day”].Replace('-','/');
var source=new SearchDailySummary
{
SearchCampaignId=pk1,
日期=pk2,
Revenue=decimal.Parse(项目[“totalConvValue”]),
成本=decimal.Parse(项目[“成本]),
Orders=int.Parse(项[“conv1PerClick”]),
Clicks=int.Parse(项[“Clicks”]),
Impressions=int.Parse(项[“Impressions”]),
CurrencyId=项目[“货币”]=“美元”?1:-1//注意:非美元(如果存在)-目前为1
};
var target=db.Set().Find(pk1,pk2)??新建SearchDailySummary();
if(db.Entry(target.State==EntityState.Detached)
{
db.SearchDailySummaries.Add(目标);
addedCount++;
}
其他的
{
//TODO?:比较源和目标,如果没有差异,则将实体状态更改为未更改
updatedCount++;
}
AutoMapper.Mapper.Map(源、目标);
itemCount++;
}
Info(“保存{0}SearchDailySummaries({1}更新,{2}添加)”,itemCount,UpdateCount,AddCount;
db.SaveChanges();
}
这是的工作版本(虽然我不是100%优化的,但它工作可靠,性能良好,只要我在一次拍摄中以500个或更少的项目组进行批处理,之后速度会呈指数级下降,但我认为这可能是一个不同的问题/主题)

//Logger.Info(“升级SearchDailySummaries…”);
使用(var db=new ClientPortalContext())
{
foreach(项目中的var项目)
{
var活动名称=项目[“活动”];
var pk1=db.SearchCampaigns.Single(c=>c.SearchCampaignName==campaignName).SearchCampaignId;
var pk2=DateTime.Parse(item[“day”].Replace('-','/');
var source=new SearchDailySummary
{
SearchCampaignId=pk1,
日期=pk2,
Revenue=decimal.Parse(项目[“totalConvValue”]),
成本=decimal.Parse(项目[“成本]),
Orders=int.Parse(项[“conv1PerClick”]),
Clicks=int.Parse(项[“Clicks”]),
Impressions=int.Parse(项[“Impressions”]),
CurrencyId=项目[“货币”]=“美元”?1:-1//注意:非美元(如果存在)-目前为1
};
var target=db.Set().Find(pk1,pk2);
if(target==null)
{
db.SearchDailySummaries.Add(来源);
addedCount++;
}
其他的
{
AutoMapper.Mapper.Map(源、目标);
db.Entry(target.State=EntityState.Modified;
updatedCount++;
}
itemCount++;
}
Info(“保存{0}SearchDailySummaries({1}更新,{2}添加)”,itemCount,UpdateCount,AddCount;
db.SaveChanges();
}
我脑海中不断浮现的一件事是,
Entry(entity)
Find(pk)
方法可能有一些副作用?我可能应该查阅文件,但如有任何建议,我将不胜感激


这是我的一个小小的假设(没有查看您的模型/实体),但请查看此块中发生的情况(查看此处附着的对象是否与删除相关):

您分离的对象将无法使用其导航属性定位其相关对象;您将以潜在冲突状态(没有正确的关系)附加对象


你还没有提到上面要删除的内容,所以我可能有点不对劲。刚出去,所以这有点匆忙,希望里面有有用的东西。

谢谢你的意见。。我仍然有点困惑,但我根据你的回答更新了我的问题。我不完全确定我的思路是否正确。事实上,如果有机会,我会尝试模拟一个本地版本,因此我的头脑中也会更清楚=DIt可能值得在
Automapper.Mapper.Map()
行设置一个断点,以及检查两个版本中的目标和源。
    //Logger.Info("Upserting SearchDailySummaries..");
    using (var db = new ClientPortalContext())
    {
        foreach (var item in items)
        {
            var campaignName = item["campaign"];

            var pk1 = db.SearchCampaigns.Single(c => c.SearchCampaignName == campaignName).SearchCampaignId;
            var pk2 = DateTime.Parse(item["day"].Replace('-', '/'));

            var source = new SearchDailySummary
            {
                SearchCampaignId = pk1,
                Date = pk2,
                Revenue = decimal.Parse(item["totalConvValue"]),
                Cost = decimal.Parse(item["cost"]),
                Orders = int.Parse(item["conv1PerClick"]),
                Clicks = int.Parse(item["clicks"]),
                Impressions = int.Parse(item["impressions"]),
                CurrencyId = item["currency"] == "USD" ? 1 : -1 // NOTE: non USD (if exists) -1 for now
            };

            var target = db.Set<SearchDailySummary>().Find(pk1, pk2);
            if (target == null)
            {
                db.SearchDailySummaries.Add(source);
                addedCount++;
            }
            else
            {
                AutoMapper.Mapper.Map(source, target);
                db.Entry(target).State = EntityState.Modified;
                updatedCount++;
            }

            itemCount++;
        }

        Logger.Info("Saving {0} SearchDailySummaries ({1} updates, {2} additions)", itemCount, updatedCount, addedCount);
        db.SaveChanges();
    }
if (db.Entry(target).State == EntityState.Detached)
{
    db.SearchDailySummaries.Add(target);
    addedCount++;
}