Ela*_*nda 19 c# sql entity-framework
我想要插入现有实体的引用成员.
我是否必须为upsert编写特定代码?
意思是:我必须检查我是在处理现有的参考成员还是新成员.
还有其他简单的方法吗?
你这样做会发生什么Save?
  public void SaveCofiguration(MamConfiguration_V1Ui itemUi)
        {
            var itemEf = mMamConfiguration_V1UiToEfConvertor.ConvertToNewEf(itemUi);
            using (var maMDBEntities = new MaMDBEntities())
            {
                IDal<MamConfiguration_V1> mamConfigurationDal = mDalFactory.GetDal<MamConfiguration_V1>(maMDBEntities);
                mamConfigurationDal.Save(itemEf);
            }
        }
         public MamConfiguration_V1 GetById(object id)
        {           
                id.ThrowIfNull("id");
                int configurationId = Convert.ToInt32(id);
                var result =
                    mMaMDBEntities.MamConfiguration_V1.SingleOrDefault(item => item.ConfigurationId == configurationId);
                return result;
        }
       public MamConfiguration_V1 Save(MamConfiguration_V1 item)
        {
                item.ThrowIfNull("item");
                var itemFromDB = GetById(item.ConfigurationId);
                if (itemFromDB != null)
                {
                    UpdateEfItem(itemFromDB, item);
                   // if (mMaMDBEntities.ObjectStateManager.GetObjectStateEntry(itemFromDB).State == EntityState.Detached)
//                    {
  //                      mMaMDBEntities.MamConfiguration_V1.AddObject(itemFromDB);
    //                }
                    // Attached object tracks modifications automatically
                    mMaMDBEntities.SaveChanges();
                    return item;
                }
       private void UpdateEfItem(MamConfiguration_V1 itemFromDb, MamConfiguration_V1 itemFromUi)
            {
                itemFromDb.UpdatedDate = DateTime.Now;
                itemFromDb.Description = itemFromUi.Description;
                itemFromDb.StatusId = itemFromUi.StatusId;
                itemFromDb.Name = itemFromUi.Name;
                itemFromDb.NumericTraffic = itemFromUi.NumericTraffic;
                itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic;
                itemFromDb.Type = itemFromUi.NumericTraffic;
                foreach (var item in itemFromDb.MamConfigurationToBrowser_V1.ToList())
                {
                    if (itemFromUi.MamConfigurationToBrowser_V1.All(b => b.BrowserVersionId != item.BrowserVersionId))
                    {
                        mMaMDBEntities.MamConfigurationToBrowser_V1.DeleteObject(item);
                    }
                }
                for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++)
                {
                    var element = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i);
                    var item = itemFromDb.MamConfigurationToBrowser_V1.SingleOrDefault(b => b.BrowserVersionId == element.BrowserVersionId);
                    if (item != null)
                    {
                        // copy properties from element to item
                    }
                    else
                    {
                        element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
                            browserItem.BrowserID == element.BrowserID);
                        //element.MamConfiguration_V1 = itemFromDb;
                        //have also tried: element.MamConfiguration_V1 = null;
                        //element.MamConfiguration_V1Reference = null;
                        itemFromDb.MamConfigurationToBrowser_V1.Add(element);
                    }
                }
            }
但我会预料到Save(itemUi)并且SaveChanges()工作正常.没有?
Rob*_*vey 22
public void InsertOrUpdate(DbContext context, UEntity entity)
{
    context.Entry(entity).State = entity.Id == 0 ?
                                   EntityState.Added :
                                   EntityState.Modified;
    context.SaveChanges();
}
http://forums.asp.net/t/1889944.aspx/1
为了避免查询然后插入或抛出异常的开销,您可以利用对合并或更新插入的底层数据库支持。
这个 nuget 包可以很好地完成这项工作:https ://www.nuget.org/packages/FlexLabs.EntityFrameworkCore.Upsert/
Github:https : //github.com/artiomchi/FlexLabs.Upsert
例子:
DataContext.DailyVisits
    .Upsert(new DailyVisit
    {
        // new entity path
        UserID = userID,
        Date = DateTime.UtcNow.Date,
        Visits = 1,
    })
    // duplicate checking fields
    .On(v => new { v.UserID, v.Date })
    .WhenMatched((old, @new) => new DailyVisit
    {
        // merge / upsert path
        Visits = old.Visits + 1,
    })
    .RunAsync();
底层生成的 sql 执行正确的 upsert。此命令会立即运行并且不使用更改跟踪,因此这是一个限制。
| 归档时间: | 
 | 
| 查看次数: | 14063 次 | 
| 最近记录: |