gpt4 book ai didi

c# - 我应该如何从每个对象中禁用 Entity Framework 表引用(外部)列表?

转载 作者:太空狗 更新时间:2023-10-29 19:42:31 25 4
gpt4 key购买 nike

我正在使用 Sqlite 数据库System.Data.SQLite 1.0.92这里有 2 个表:


table 上人:

个人身份

人名


表学生:

学号

PersonId(引用表Person FK)

学号


现在每次我在 EF5 中获取 Persons 集合时:

using (var ctx = new myEntities)
{
AllPersons = ctx.Persons.ToList();
}

还有AllPersons.student集合会包含在结果中;

但我不需要它。当然这只是一个例子,有很多大表有很多引用,因此这里总是有性能问题。

所以我尽量不让它出现在我的结果中。所以我改变它:

using (var ctx = new myEntities)
{
ctx.Configuration.ProxyCreationEnabled = false;
ctx.Configuration.LazyLoadingEnabled = false;
AllPersons= ctx.Persons.ToList();
}

现在好了,因为 AllPersons.student 集合将始终为 null

但现在我发现:如果我将 Person 和 Student 放在一起:

using (var ctx = new myEntities)
{
ctx.Configuration.ProxyCreationEnabled = false;
ctx.Configuration.LazyLoadingEnabled = false;
AllPersons= ctx.Persons.ToList();
AllStudents = ctx.Student.ToList();
}

现在引用仍然包含在.

那么在这种情况下,有什么办法可以不让引用包含在中吗?谢谢。


更新

对于一些 friend 的要求,我解释一下我为什么需要它:

1:当我将它转换为 json 时,它将是一个死循环。即使我已经使用了 Json.net ReferenceLoopHandling,json 的大小也很大,足以让服务器崩溃。(如果没有引用,它只是一个非常小的 json)

2:每次获取客户端数据需要保存时,都会显示模型状态异常,直到我设置为null

例子:

using (myEntities ctx = new myEntities())
{
ctx.Configuration.LazyLoadingEnabled = false;
ctx.Configuration.ProxyCreationEnabled = false;



Person model= ThisIsAModel();

model.students = null; // This is a key, I need set the students collection references to null , otherwise it will throw exception

ctx.Entry(model).State = EntityState.Modified;
ctx.SaveChanges();

}

3:这是更重要的问题。我已经在服务器上获取了所有数据和缓存。但是它会让服务器启动时加载时间很长。 (因为资料和引用文献太多了,这是主要问题),不知道又会遇到什么样的问题....

public List<Person> PersonsCache; // global cache
public List<Student> StudentsCache; // global cache
using (myEntities ctx = new myEntities())
{
ctx.Configuration.LazyLoadingEnabled = false;
ctx.Configuration.ProxyCreationEnabled = false;
// There is so many references and data, will let it very slow , when I first time get the all cache. even I only get the Person model, not other , just because some Collection has some references problem. It will very slow....

PersonsCache = ctx.Persons.ToList();
StudentsCache= ctx.Student.ToList();
}

最佳答案

问题

如您所说,当您同时加载父项和子项列表时,即使禁用了 LazyLoading,然后查看 parent.Childs,您也会看到子项也已加载。

var db = new YourDbContext();
db.Configuration.LazyLoadingEnabled = false;
var parentList= db.YourParentSet.ToList();
var childList= db.YourChildSet.ToList();

发生了什么事?为什么子项包含在父项中?

父实体下的子实体是您使用 db.YourChildSet.ToList(); Exactly themselves 加载的实体;事实上, Entity Framework 再也不会为父项加载子项,但由于 edmx 中父项和子项之间的关系,它们会列在那里。


这会影响性能吗?

根据childs只加载一次的事实,加载数据对性能没有影响。


但是为了序列化或其他原因,我怎样才能摆脱它?

您可以使用这些解决方案:

解决方案 1:

使用 2 个不同的 YourDbContext 实例:

var db1 = new YourDbContext();
db1.Configuration.LazyLoadingEnabled = false;
var parentList= db.YourParentSet.ToList();

var db2 = new YourDbContext();
db2.Configuration.LazyLoadingEnabled = false;
var childList= db.YourChildSet.ToList();
  • 现在,当您查看 parent.Childs 时,其中没有 Child。

解决方案 2:

使用 Projection 并根据您的意愿调整输出并使用它们。

var db1 = new YourDbContext();
db1.Configuration.LazyLoadingEnabled = false;
var parentList= db.YourParentSet
.Select(x=>new /*Model()*/{
Property1=x.Property1,
Property2=x.Property2, ...
}).ToList();
  • 这样在序列化时就没有什么烦人的了。
  • 使用自定义模型类是可选的,在某些情况下建议使用。

其他资源

作为使用 Entity Framework 的开发人员,强烈建议阅读这些资源:

关于c# - 我应该如何从每个对象中禁用 Entity Framework 表引用(外部)列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31107876/

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