簡體   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