c# - ASP.NET C# Entity Framework - 如何正确更新外键?

标签 c# asp.net entity-framework-4

我是这个 EF 的新手,但我认为我正在取得进步。无论如何,我似乎不知道如何更新一个由外键相关的对象。

我的 DbRelation 是: enter image description here

我正在尝试更新一个成员 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);

在方法 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();
                    }
                }
            }

在方法 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 模型的情况下更改了数据库结构?请记住,重新生成并不总是更新所有内容,有时您必须手动更新它,或者删除您的对象并重新添加它们。

第四,你真正的问题(相信我,我列出的那些也是真正的问题,WILL 在某些时候咬你的屁股)在于这段代码:

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

首先你要意识到EF返回被跟踪的对象,这些对象在EF中有引用并且跟踪发生的变化。您在这里所做的是获取一个对象,然后将其丢弃并用传入的非跟踪对象替换它。

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

关于c# - ASP.NET C# Entity Framework - 如何正确更新外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373899/

相关文章:

entity-framework - "Entity Tracked by Context"在 Entity Framework 中是什么意思

c# - 重试 HttpClient 不成功的请求

c# - 将 C# 列表转换为 JSON 特定格式

javascript - 样式 ASP.net DropDownList 不选择元素下拉列表

c# - 将路由传递给 Controller ​​操作

entity-framework - Entity Framework 4信息库?

visual-studio - 保存 EDMX 时是否可以防止重新生成 T4 文件?

c# - OleDbDataReader 如何读取数字类型?

C#:运行和调试 Windows 服务

c# - 下拉列表选定索引更改上的不同 SQL 数据源