EF upsert是否必须手动完成? [英] Does EF upsert have to be done manually?

查看:113
本文介绍了EF upsert是否必须手动完成?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我是否要为upsert写入特定的代码?



意思是:我必须检查我是否正在处理现有的参考成员或新的参考成员。



有没有其他简单的方法?



只有保存才会发生什么?

  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);

返回结果;

}

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);
//}

//附加对象自动跟踪修改
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(itemFromDb.MamConfigurationToBrowser_V1.ToList()中的var项)
{
if(itemFromUi.MamConfigurationToBrowser_V1.All(b => b.BrowserVersionId!= item.BrowserVersionId ))
{
mMaMDBEntities.MamConfigurationToBrowser_V1.DeleteObject(item); $ int



$ b for(int i = 0; i< itemFromUi.MamConfigurationToBrowser_V1.Count; i ++)
{
var element = itemFromUi。 MamConfigurationToBrowser_V1.ElementAt(ⅰ);
var item = itemFromDb.MamConfigurationToBrowser_V1.SingleOrDefault(b => b.BrowserVersionId == element.BrowserVersionId);
if(item!= null)
{
//将属性从元素复制到项目
}
else
{
element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
browserItem.BrowserID == element.BrowserID);

//element.MamConfiguration_V1 = itemFromDb;

//也尝试过:element.MamConfiguration_V1 = null;

//element.MamConfiguration_V1Reference = null;

itemFromDb.MamConfigurationToBrowser_V1.Add(element);
}
}
}

但我会期待保存(itemUi) SaveChanges()正常工作。否?

解决方案

  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


I want to upsert reference members of an existing entity.

Do I have to write specific code for the upsert?

meaning: I have to check if I'm handling an existing reference member or a new one.

Is there any other simple way to do so?

What happens when you do only 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);
                    }
                }
            }

But I would have expecte Save(itemUi) and SaveChanges() to work fine. No?

解决方案

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

这篇关于EF upsert是否必须手动完成?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆