gpt4 book ai didi

c# - Entity Framework 核心 : Adding an object with a List to a DbContext results in an empty List

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:31 27 4
gpt4 key购买 nike

我们正在尝试将 Entity Framework 模型保存到数据库中。

在模型中,一个轨道总是包含一个消息,并且一个消息可以在其重传列表中包含任意数量的消息。

保存模型时,我们检查Track模型是否已经存在于数据库中;如果没有,我们只需将 Track 添加到 DbContext。

public class Track
{
[Key]
public Guid TrackId { get; set; }
public virtual Message Message { get; set; }
}

public class Message
{
[Key]
public Guid MessageId { get; set; }
public Guid TrackId { get; set; }

public virtual List<Message> Retransmits { get; set; }
}

public void Save (Track track)
{
using (var context = new DatabaseContext())
{
Track foundTrack = Read(track.TrackId); // Returns a Track if it already exists in the database

if (foundTrack == null)
{
context.Add(track);
}
else
{
// Update the Track. Not relevant to this question
}

context.SaveChanges();
}
}

// Returns a Track if it exists in the database or null
public Track Read(Guid trackId)
{
using (var context = new DatabaseContext())
{
return context.Tracks
.Include(t => t.Message)
.ThenInclude(m => m.Retransmits)
.FirstOrDefault(t => t.TrackId == trackId);
}
}

将 Track 添加到 DbContext Entity Framework 时,将始终清除重传列表。这意味着消息在调用 DbContext.Add 之前可以在其重传列表中包含一条消息,但在调用 DbContext.Add 之后它会突然变为 0。 Entity Framework 正在有效地清除列表而不是将其添加到数据库中。

我们预计重传列表将被添加到 DbContext,并且不会在没有警告的情况下从模型中删除。

在调试过程中,我们发现从 List<Message> 更改重传列表至 List<AnyOtherObject>返回数据库中的预期结果和行。

似乎因为重传列表与它包含在其中的类属于同一类型(即一条消息可以包含许多消息), Entity Framework 对它的处理方式不同。

我们还尝试在 modelBuilder.Entity<Message>().HasMany(m => m.Retransmits) 所在的实体之间配置一对多关系没有区别。乃至 modelBuilder.Entity<Message>().HasMany(m => m.Retransmits).WithOne(m => m.Parent)其中 Parent 是对重传消息的包含对象的引用。但是,这导致了 StackOverflow 异常。

Entity Framework 拒绝将列表添加到数据库的原因可能是什么?有什么方法可以配置 Entity Framework 以允许消息包含重传列表(属于消息类型)并按预期将其添加到数据库中?还是我们完全做错了什么?

I have attached an image of the behavior in Visual Studio's Debugger.

编辑:我们已经尝试了最新的稳定 Entity Framework Core 版本 2.2.6,以及 Entity Framework Core 版本 3.0.0 - Preview 9。两个版本都存在相同的行为。

编辑 编辑:以下代码初始化模型并且应该重现问题。

public void ReproduceIssue ()
{
// Create a Track and Message
Track track = new Track()
{
Message = new Message()
};

track.Message.TrackId = track.TrackId;

// Create a Retransmitted Message
Message retransmit = new Message()
{
TrackId = track.TrackId
};

// Add the Retransmitted Message to the List
track.Message.Retransmits.Add(retransmit);

Save(track);
}

最佳答案

我们对模型进行了一些更改。虽然我认为 Entity Framework 不应该在不发出警告/异常的情况下丢弃任何信息,但我们确实规避了这个问题。

我想发布代码,但它有点复杂,因为原始问题遗漏了很多代码细节。但是,解决方案基本上是使用连接表在消息之间配置多对多关系。

在那之后,它的行为符合预期。

关于c# - Entity Framework 核心 : Adding an object with a List to a DbContext results in an empty List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57920530/

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