1

ASP.NET MVC プロジェクトには 2 つのモデルがあります。テストデータを含めるためにシードするときは、次のことを行います。

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 }
    }
});

これにより、ダイアログテーブルにレコードが保存されますが、アクションは保存されません。最初にダイアログを保存してからアクションを追加できることはわかっていますが、上記のようにすべてインラインで追加できるようにしたいですか?

ダイアログ モデル:

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 を使用するようにモデルを更新する必要があります。この投稿から:

Entity Framework は、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 は実際にデータベースにマップされていますか? 注: Actions テーブルの 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 に答える