的关系无法被改变..外键的属性是不可为空 [英] The relationship could not be changed .. the foreign-key properties is non-nullable

查看:369
本文介绍了的关系无法被改变..外键的属性是不可为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图更新类型的实体 MamConfiguration_V1

这已经exsit在DB

它有几个参考成员(其中 MamConfigurationToBrowser_V1

 私人无效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;
        itemFromDb.MamConfigurationToBrowser_V1.Clear();        的for(int i = 0; I< itemFromUi.MamConfigurationToBrowser_V1.Count;我++)
        {
            变种elementToAdd = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(ⅰ);            elementToAdd.Browser = mMaMDBEntities.Browsers.Single(browserItem => browserItem.BrowserID == elementToAdd.BrowserID);            elementToAdd.MamConfiguration_V1 = itemFromDb;            itemFromDb.MamConfigurationToBrowser_V1.Add(elementToAdd);
        }

}

我得到以下DB运行时错误:

操作失败:关系不能被改变,因为一个或多个外键的属性是不可为空。当一个变化是有关系提出,相关外键属性设置为空值。如果外键不支持空值,一种新的关系必须定义,外键属性必须指定一个非空值,或者无关的对象必须被删除。

但是,这很奇怪。所有引用不为空:

2 UPADTE:

我已经试过这code:

 尝试
        {
            item.ThrowIfNull(项目);            VAR itemFromDB = GetById(item.ConfigurationId);            如果(itemFromDB!= NULL)
            {
                UpdateEfItem(itemFromDB,项目);                //mMaMDBEntities.MamConfiguration_V1.Detach(itemFromDB);                //mMaMDBEntities.MamConfiguration_V1.Attach(item);                //mMaMDBEntities.ObjectStateManager.ChangeObjectState(item,System.Data.EntityState.Modified);                //mMaMDBEntities.ObjectStateManager.ChangeObjectState(itemFromDB,System.Data.EntityState.Modified);
                mMaMDBEntities.SaveChanges();                归还物品;
            }

}

 私人无效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项目())
            {
                如果(itemFromUi.MamConfigurationToBrowser_V1.All(B = GT;!b.BrowserVersionId = item.BrowserVersionId))
                {
                    mMaMDBEntities.MamConfigurationToBrowser_V1.DeleteObject(项目);
                }
            }            的for(int i = 0; I< itemFromUi.MamConfigurationToBrowser_V1.Count;我++)
            {
                无功元件= itemFromUi.MamConfigurationToBrowser_V1.ElementAt(ⅰ);
                VAR项目= itemFromDb.MamConfigurationToBrowser_V1.SingleOrDefault(B = GT; b.BrowserVersionId == element.BrowserVersionId);
                如果(项目!= NULL)
                {
                    //从元素复制性能项目
                }
                其他
                {
                    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(元件);
                }
            }
        }

和去这个错误:


  

{UNIQUE KEY约束'UQ_MamConfigurations_V1的相关规定。无法
  插入对象dbo.MamConfiguration_V1重复键。该
  重复的键值是(elad_14Apr_1315)。\\ r \\ n此语句已被
  终止。}



解决方案

这行...

  itemFromDb.MamConfigurationToBrowser_V1.Clear();

...不仅将清除集合,但也设置为从集合中的单个项目到父 itemFromDb 空<参考/ code>。这是这些项目的修改和EF会尽量将它们保存到数据库中。因为(可能)是必需的参考,不能失败

您必须采取不同的方式,即由一个更新集合之一的项目。必须考虑到,物品可以在UI已被删除的帐户,他们可能已被修改和可能已添加了新的项目。这将类似于这样:

 私人无效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项目())
    {
        如果(itemFromUi.MamConfigurationToBrowser_V1.Any(B = GT!;
            b.BrowserID == item.BrowserID)
        {
            mMaMDBEntities.Browsers.DeleteObject(项目);
        }
    }    的for(int i = 0; I&LT; itemFromUi.MamConfigurationToBrowser_V1.Count;我++)
    {
        无功元件= itemFromUi.MamConfigurationToBrowser_V1.ElementAt(ⅰ);
        VAR项目= itemFromDb.MamConfigurationToBrowser_V1
            .SingleOrDefault(B = GT; b.BrowserID == element.BrowserID);
        如果(项目!= NULL)
        {
            //从元素复制性能项目
        }
        其他
        {
            element.Browser = mMaMDBEntities.Browsers.Single(browserItem =&GT;
                browserItem.BrowserID == element.BrowserID);            itemFromDb.MamConfigurationToBrowser_V1.Add(元件);
        }
    }
}

I'm trying to update an entity of type MamConfiguration_V1

which exsit already in the DB

It has few reference members (among them MamConfigurationToBrowser_V1)

  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;


        itemFromDb.MamConfigurationToBrowser_V1.Clear();



        for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++)
        {
            var elementToAdd = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i);

            elementToAdd.Browser = mMaMDBEntities.Browsers.Single(browserItem => browserItem.BrowserID == elementToAdd.BrowserID);

            elementToAdd.MamConfiguration_V1 = itemFromDb;

            itemFromDb.MamConfigurationToBrowser_V1.Add(elementToAdd);
        }

}

I get the following DB runtime error:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

But that's weird. All the references are not null:

Upadte 2:

I have tried this code:

        try
        {
            item.ThrowIfNull("item");

            var itemFromDB = GetById(item.ConfigurationId);

            if (itemFromDB != null)
            {
                UpdateEfItem(itemFromDB, item);

                //mMaMDBEntities.MamConfiguration_V1.Detach(itemFromDB);

                //mMaMDBEntities.MamConfiguration_V1.Attach(item);

                //mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified);

                //mMaMDBEntities.ObjectStateManager.ChangeObjectState(itemFromDB, System.Data.EntityState.Modified);


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

and go this error:

{"Violation of UNIQUE KEY constraint 'UQ_MamConfigurations_V1'. Cannot insert duplicate key in object 'dbo.MamConfiguration_V1'. The duplicate key value is (elad_14Apr_1315).\r\nThe statement has been terminated."}

解决方案

This line...

itemFromDb.MamConfigurationToBrowser_V1.Clear();

...will not only clear the collection but also set the reference from the individual items in the collection to the parent itemFromDb to null. That's a modification of those items and EF will try to save them to the database. It fails because (probably) the reference is required and cannot be null.

You must take a different approach, that is updating the items in the collection one by one. You must take into account that items could have been deleted in the UI, that they could have been modified and that new items could have been added. It would look similar to this:

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.Any(b =>
            b.BrowserID == item.BrowserID)
        {
            mMaMDBEntities.Browsers.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.BrowserID == element.BrowserID);
        if (item != null)
        {
            // copy properties from element to item
        }
        else
        {
            element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
                browserItem.BrowserID == element.BrowserID);

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

这篇关于的关系无法被改变..外键的属性是不可为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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