gpt4 book ai didi

c# - Entity Framework 延迟加载不起作用

转载 作者:行者123 更新时间:2023-11-30 16:58:22 27 4
gpt4 key购买 nike

我正在将我的项目从 EF 4.0 迁移到 EF 6.0。我试图在插入新实体后从导航实体获取属性。该代码在 EF 4.0 中运行没有任何问题,但是当我尝试在 EF 6.0 中运行时,我遇到了 NullReference Exception。

用户实体:

public partial class users
{
public int RID { get; set; }
public string Name { get; set; }
public Nullable<int> LangRef { get; set; }

public virtual language language { get; set; }
}

语言实体:

public partial class language
{
public language()
{
this.users = new HashSet<users>();
}

public int RID { get; set; }
public string Name { get; set; }

public virtual ICollection<users> users { get; set; }
}

测试代码:

test1Entities testEnt = new test1Entities();
users user = new users();
user.Name = "asd";
user.LangRef = 1;//That ID refer to English record in Language entity
testEnt.users.Add(user);
testEnt.SaveChanges();

string lang = user.language.Name;//Should return "English". However language property seem null

型号:

Model:

最佳答案

你说user.language.Name应该返回英语,你没有在任何地方设置它。您必须在创建新用户时设置语言。

test1Entities testEnt = new test1Entities();
users user = new users();
user.Name = "asd";
user.LangRef = 1;

// grab the english language entity from the database
language englishLanguage = entities.First(o => o.Name == "English");

// set the users language to english
user.language = englishLanuage;

testEnt.users.Add(user);
testEnt.SaveChanges();

想象一下,如果您使用原始 SQL 插入用户,您将运行类似这样的操作

INSERT INTO users (name, languageId) VALUES ('Foo', 1);

其中 1 是语言表中映射到英语的记录的 RID。 1 是用户表中的外键,它将用户映射到他们的语言。与原始 SQL 相同,您必须明确告诉 Entity Framework 用户使用的是哪种语言。这是通过查询 DbContext 的语言(它返回一个被跟踪的实体),然后将该实体设置为导航属性来完成的。


或者,如果您事先知道语言记录的主键,则可以创建一个新的语言实体(具有正确的 RID)并将其附加到 DbContext,然后将其设置到导航属性。这样就可以减少对数据库的查询。虽然这会更有效一些,但您应该做任何对您来说更容易/最有意义的事情。让它工作,然后您可以在以后优化瓶颈。

language englishLanguage = new language() { RID = 1, Name = "English" };
testEnt.languages.Attach(language);

user.language = englishLanguage;
testEnt.users.Add(user);

编辑

鉴于您最近的编辑,现在您正在尝试做什么更清楚了。我没有意识到 LangRef 是您的外键,因为它是十进制的并且不遵循正常的命名约定。

此答案中描述了解决方案,https://stackoverflow.com/a/18251442/1160036 .问题来自 Entity Framework 缓存。在SaveChanges()之后(这样RID就更新了),可以detach重新拉取用户来刷新。

testEnt.users.Add(user);
testEnt.SaveChanges();
((IObjectContextAdapter)testEnt).ObjectContext.Detach(user);
users user = testEnt.First(o => o.RID == user.RID);
Console.WriteLine(user.language.Name);

打开一个新的 DbContext 也可以,但这确实会导致与数据库建立另一个连接。

如上述答案所述,testEnt.Entry<users>(user).Reload()不幸的是不起作用。

关于c# - Entity Framework 延迟加载不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25354301/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com