EF6:如何避免循环引用?

17 浏览
0 Comments

EF6:如何避免循环引用?

在使用ASP.NET Web API进行JSON序列化时,如何避免Entity Framework 6中的循环引用的可能性是什么?

我为Entity Framework 6生成了一个edmx(Entity Data Model)文件,采用数据库优先的方法。我试图使用ASP.NET Web API构建一个API。当我尝试在我的控制器中返回我的JSON对象时,由于循环引用,我得到了一个运行时序列化异常。

事实上,当我仔细检查我的数据库和实体时,我发现我的一个实体包含一个包含我的先前实体列表的另一个实体列表。假设我有一个包含作者的书籍实体,而每个作者实体又包含一本书的列表。这是相对数据库中常见的情况,但在JSON序列化中无法解决(或者对于.NET序列化器来说无法解决)。

我不想改变我的数据库,但我愿意在我的实体或edmx文件中打破错误的列表。我该怎么办?

我尝试过的方法:

我已经尝试过创建新模型或实体并使用映射工具的解决方案(http://www.codeproject.com/Articles/292970/Avoiding-Circular-Reference-for-Entity-in-JSON-Ser或由Shawn Wildermuth在Pluralsight上解释的解决方案)。

这个解决方案更像是一个变通方法而不是一个真正的解决方案。在edmx文件或Entity Framework中应该存在某种方法来告诉JSON序列化器什么可能导致循环引用,什么可以和必须被序列化,什么不能被序列化,对吧?

0
0 Comments

EF6中避免循环引用的问题通常是由于直接序列化领域模型导致的。解决方法是创建一个视图模型,将数据以期望的格式返回。使用领域模型来填充视图模型。

视图模型在定义数据的公共视图时很有用。领域模型描述了团队和内部利益相关者对业务功能的理解。可以通过保持公共视图不变来重构内部结构。

为了遵守DRY(Don't Repeat Yourself)原则,我们不应直接序列化领域模型,而应创建视图模型来提供数据。视图模型定义了数据的公共视图,而领域模型则用于描述业务功能。通过这种方式,可以在保持公共视图不变的同时重构内部结构。

关于为什么要使用视图模型的更多信息可以参考这里:Why do we use ViewModels?

0
0 Comments

EF6: 如何避免循环引用?

在序列化领域模型时,技术上并没有问题。为了避免循环引用,不能使用延迟加载。必须保持对加载的控制。为此,请按照以下步骤操作:

1. 在模型的每个集合之前删除 virtual 关键字(在代码优先方法中)。

2. 将延迟加载配置设置为 false(在数据库优先方法中)。

你尝试过忽略引用循环处理吗?可以参考以下链接:stackoverflow.com/questions/19467673/…

0
0 Comments

EF6: 如何避免循环引用?

在使用EF6进行开发过程中,可能会遇到循环引用的问题。循环引用是指在数据结构中存在相互依赖的关系,导致无法正确地序列化和反序列化数据。下面将介绍循环引用问题的原因以及解决方法。

循环引用问题的原因是由于UI和后端数据结构之间的相互依赖关系。为了解决这个问题,我们需要使用一个ViewModel作为UI和后端数据结构之间的接口。ViewModel充当了适配器的角色,用于转换和适应UI和后端数据结构之间的差异。通过使用ViewModel,我们可以避免直接在UI中引用后端数据结构,从而避免循环引用的问题。

下面是一种解决方法的示例代码:

// 后端数据结构
public class BackendData
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection ViewModels { get; set; }
}
// ViewModel
public class ViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection BackendDatas { get; set; }
}
// 在使用EF进行数据查询时,使用ViewModel作为中间层
var viewModels = dbContext.BackendDatas.Select(bd => new ViewModel
{
    Id = bd.Id,
    Name = bd.Name
}).ToList();

通过上述示例,我们可以看到ViewModel作为UI和后端数据结构之间的适配器,用于转换和适应两者之间的差异。这样,我们就可以避免直接在UI中引用后端数据结构,从而避免循环引用的问题。

总结起来,使用ViewModel作为UI和后端数据结构之间的接口是避免循环引用问题的有效方法。通过使用ViewModel适配器,我们可以将数据结构转换为适合UI显示的形式,从而避免循环引用的问题的出现。希望这篇文章对你有所帮助。

0