【问题标题】:EF Core - import entity with relationships to entities that dont exist yetEF Core - 导入与尚不存在的实体有关系的实体
【发布时间】:2021-03-27 06:55:25
【问题描述】:

我遇到了这个莫名其妙的特殊任务。我的模型是这样的

public class Bot
{
    public int Id { get; set; }

    public StoryItem StartItem { get; set; }

    public IEnumerable<Story> Stories { get; set; }
}

public class Story
{
    public int Id { get; set; }

    public int BotId { get; set; }

    public IEnumerable<StoryItem> Items { get; set; }

    public IEnumerable<StoryLink> Links { get; set; }
}

public class StoryItem
{
    public int Id { get; set; }

    public int StoryId { get; set; }
}

public class StoryLink
{
    public int Id { get; set; }

    public int StoryId { get; set; }

    public int SourceItemId { get; set; }

    public StoryItem SourceItem { get; set; }

    public int TargetItemId { get; set; }

    public StoryItem TargetItem { get; set; }
}

在我的应用程序中,有一个选项可以将 Bot 导出为 json(及其所有属性)。

有问题的部分是实现导入功能。有没有办法导入机器人实体,以及它与实体的所有关系,但还不存在(它们需要在导入过程中创建)? EF 能以某种方式智能地做到这一点吗?

一种方法是逐个导入所有内容并将旧 ID 映射到新 ID,但我希望有更复杂的方法。

如果有任何建议,我将不胜感激,谢谢。

【问题讨论】:

    标签: c# .net entity-framework .net-core entity-framework-core


    【解决方案1】:

    首先 - 将 IEnumerable&lt;T&gt; 替换为 List&lt;T&gt;

    EF可以保存相关实体。

    vat bot = new Bot();
    var story = new Story();
    bot.Stories.Add(story);
    
    dbContext.Set<Bot>().Add(bot);
    dbContext.SaveChanges();
    

    【讨论】:

    • 首先,IEnumerable&lt;T&gt; 在 EF Core 中很好用。其次,您似乎不了解实际的 OP 问题 - 他们的模型具有循环关系 Bot StoryItem,它(如鸡和蛋)无法通过单个 SaveChanges 自动处理。
    • @IvanStoev 您是说不可能以简单的方式实现吗?我希望也许 EF 会以某种方式自动将旧 ID 映射到新 ID。
    • @merlinko 问题不在于 ID。实际上,如果它们是自动生成的,您需要在调用Add 之前将它们全部清除。新的 id 将从导航属性生成并正确映射。但是 StoryItem 不能在没有故事的情况下创建,并且故事不能在没有 Bot 的情况下创建,因此新的 Bot 不能有 StoryItem。您需要将该属性设置为 null,然后将 SaveChanges 设置回去并再次执行 SaveChanges
    • @IvanStoev 如果这是唯一的手动步骤,那会很好:) 但是我怎么知道应该在 Bot 上的是哪个 StoryItem?
    • @merlinko 通过将属性的原始值存储在变量中?或者如果反序列化器不保留引用,则在反序列化对象图中通过 Id 手动查找,将其存储在变量中并稍后使用(当它已经在数据库中创建时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多