繁体   English   中英

ASP.NET C#实体框架-如何正确更新外键?

[英]ASP.NET C# Entity Framework - How to update Foreign Key properly?

我对这个EF很陌生,但我想我正在进步。 无论如何,看来我不知道如何更新与外键相关的对象。

我的DbRelation是: 在此处输入图片说明

我正在尝试更新一个成员LANGUAGEID,这是我调用的上下文:

public class ManagerBase
    {
        private static NoxonEntities _entities = null;

        public NoxonEntities Entities
        {
            get
            {
                if (_entities == null)
                    _entities = new NoxonEntities();

                return _entities;
            }
        }
    }

我尝试了很多东西。 这是一个:

1)

MemberManager currentMemberManager = new MemberManager();
var Mem = currentMemberManager.MyEntities.Member.SingleOrDefault(c => c.Id == 2);
var Lang = currentLanguageManager.Entities.Language.SingleOrDefault(c => c.Id == 1);

            Mem.Language = Lang;
//Or
            Mem.LanguageId = Lang.Id;
currentMemberManager.Save(Mem);

在Appreach 1中,出现类似以下错误

The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: A referential integrity constraint violation occurred: The property values that define the referential constraints are not consistent between principal and dependent objects in the relationship.

2)

//Managers uses ManagerBase class as a Base class
MemberManager currentMemberManager = new MemberManager();
currentMemberManager.Save(Globals.CurrentMember.Id, Globals.CurrentLanguage.Id);
//These Global objects coming from a Http Session
//You may also say not to keep whole member object in session which I'll not after I figure this out

Here is my SAVE method and where I have the actual problem:

public void Save(Member entity)
        {
            var Data = base.Entities.Member.First(c => c.Id == entity.Id);
                    if (Data != null)
                    {
                        Data = entity;
                        base.Entities.SaveChanges();
                    }
                }
            }

在appreach 1中,我在EF模型edmx文件中的此代码中收到错误

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.Int32 LanguageId
        {
            get
            {
                return _LanguageId;
            }
            set
            {
                OnLanguageIdChanging(value);
                ReportPropertyChanging("LanguageId");
                _LanguageId = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("LanguageId");
                OnLanguageIdChanged();
            }
        }

错误是

Object reference not set to an instance of an object.

显然,我对EF的看法不正确。

您能否帮助我,并说明如何正确更新关系ID(ForeignKeyId)?

非常感谢。

是的,您使用EF的方式有很多错误。 首先,正如Arran指出的那样,您永远不要使数据上下文静态。 我知道这似乎更容易,但这是一个很大的问题,因为数据上下文被设计为经常创建和销毁。

如果您不这样做,那么对象图将继续增长,直到最终耗尽应用程序池,再加上并发访问,您可能会遇到各种问题。 静态对象在所有线程之间共享,因此可以想象一下,如果两个用户同时使用您的应用程序,则它们都将使用相同的数据上下文,并且会彼此脚。

其次,由于许多原因,您正在使用单例,这是目前最受指责的模式之一。 它们有用途,但是比大多数人使用它们稀有得多。

第三,根据错误消息,听起来您的数据模型可能与EF模型不同步,因此它变得混乱并引发异常。 您是否在不更新ef模型的情况下更改了数据库结构? 请记住,重新生成并不总是会更新所有内容,有时您必须手动更新它,或者删除对象并重新添加它们。

四,你真正的问题(相信我,我已经奠定了的人也是现实的问题,那咬你在某一点后)就在于此代码:

var Data = base.Entities.Member.First(c => c.Id == entity.Id);
if (Data != null)
{
    Data = entity;
    base.Entities.SaveChanges();
}

您必须意识到的第一件事是EF返回跟踪的对象,这些对象在EF中具有引用并跟踪发生的更改。 您在这里所做的是获取一个对象,然后将其扔掉,并用传入的非跟踪对象替换它。

您必须更新从First方法返回的对象,而不是用新对象替换它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM