1

我的 ASP.NET MVC 项目中有两个模型。在播种以包含测试数据时,我执行以下操作:

context.Dialogs.Add(new Dialog
{
    Id = 1,
    Chapter = 1,
    Index = 0,
    DialogColor = "default-color",
    DialogText = "blah blah!",
    Character = "none",
    Transition = false,
    Fade = true,
    Timer = 0,
    Actions = new List<Action>
    {
        new Action { ActionText = "--continue--", ActionLink = 1, Id=1 }
    }
});

这将记录保存在 Dialog 表中,但未保存 Actions,我知道我可能可以先保存对话框,然后将 Action 添加到它,但我希望能够像上面那样将其全部内联添加?

对话模型:

public class Dialog
{
    [Key]
    public int Id { get; set; }
    public int Chapter { get; set; }
    public int Index { get; set; }
    public string DialogColor { get; set; }
    public string DialogText { get; set; }
    public string Character { get; set; }
    public bool Transition { get; set; }
    public bool Fade { get; set; }
    public int Timer { get; set; }

    public virtual IEnumerable<Action> Actions { get; set; }
}

行动模式:

public class Action
{
    [Key]
    public int Id { get; set; }
    public string ActionText { get; set; }
    public int ActionLink { get; set; }

    public Dialog Dialog { get; set; }
}
4

1 回答 1

1

您需要更新模型以使用 ICollection,以便实体框架进行正确的关联。从这篇文章

实体框架不支持通过 Add 和 Remove 方法公开为 IEnumerable 的集合属性。

在您的对话框类中,将您的属性更新为:

 public virtual ICollection<Action> Actions { get; set; }

编辑:

结合其他要查找的内容,导航属性是否已映射?

您可以尝试添加流畅的映射:

  protected override void OnModelCreating( DbModelBuilder modelBuilder )
  {
     modelBuilder.Entity<Dialog>()
        .HasMany(d => d.Actions)
        .WithOptional(a => a.Dialog);

  }

FK 是否真的被映射到数据库中?注意:操作表上的 Dialog_Id。如果你没有这个,那么 EF 实际上并没有映射你的关系

在此处输入图像描述

如果这些都不起作用,您可以在列表中创建实体时始终将实体显式添加到您的上下文中:

     context.Dialogs.Add( new Dialog
     {
        Id = 1,
        Chapter = 1,
        Index = 0,
        DialogColor = "default-color",
        DialogText = "blah blah!",
        Character = "none",
        Transition = false,
        Fade = true,
        Timer = 0,
        Actions = new List<Action>
            {
                context.Actions.Add(new Action()
                                       {
                                          ActionText = "--continue--",
                                          ActionLink = 1, Id=1 
                                       })
            }
     } );

将实体添加到上下文后, DbSet.Add方法将返回该实体。

于 2012-08-27T19:20:49.587 回答