3

DbContextなどのエンティティコアクラスで遊んでいて、オブジェクトを保存しようとすると次のエラーが発生しました。

関係の外部キープロパティを公開していないエンティティの保存中にエラーが発生しました。単一のエンティティを例外のソースとして識別できないため、EntityEntriesプロパティはnullを返します。保存中の例外の処理は、エンティティタイプの外部キープロパティを公開することで簡単にできます。詳細については、InnerExceptionを参照してください。

私は基本的に、次のような多対多のERDを持っています

comment   comment_category   category
id        comment_id         id
text      category_id        name

comment_categoryテーブルは、コメントをカテゴリにマップするためのコンボ主キーです。

データの取得は問題ありませんが、保存しようとすると、関係について不平を言います

私が最も興味を持っているモデルは次のようになります

public class Comment
{
   [Key]
   public int Comment_Id {get;set;}
   public string Text {get;set;}
   public virtual List<Category> Categories { get; set; }
} 
public class Comment_Category
{
    [Key, Column(Order = 0)]
    public int Comment_Id {get;set;}
    [Key, Column(Order = 2)]
    public int Factor_Id {get;set;}
}

そして、そのような使用

#Comments have Categories with Category Id filled and Comment Id null
List<Comment> comments = getComments();
using(dbContext db = new dbContext())
{
  foreach( Comment c in comments)
    db.Comments.add(c);
  db.SaveChanges();
}

なぜそれを簡単に見つけることができるのか完全にはわかりませんが、節約するのに苦労しています。私が考えることができる唯一の違いは、私が保存しているコメントは新しいので、コメントIDはなく、カテゴリIDだけのコメントカテゴリしかないということです。コメントを保存し、comment_idをcomment_categoryテーブルに割り当てると想定したため、これを実行する方法がわかりません。

カテゴリの実際のエンティティではなくマッピングテーブルを使用しているという点で、おそらく私のアプローチが間違っていることに気付きました。誰かがより良い方法を知っている場合は、共有してください。

ありがとう!

4

1 に答える 1

0

多くの儀式を行わずにこれを行う最も簡単な方法は、カテゴリにコメントのコレクションも用意し、Entity Framework に M:M 関係を推測させることです。主キーと外部キーを持つ CategoryComments テーブルが自動的に作成されます。

したがって、モデルの場合、次のようになります。

public class Comment
{
    [Key]
    public int Comment_Id { get; set; }
    public string Text { get; set; }
    public virtual List<Category> Categories { get; set; }
}

public class Category
{
    [Key]
    public int Category_Id { get; set; }
    public string Name { get; set; }
    public virtual List<Comment> Comments { get; set; }
}

使用法は次のようになります。

public class MyDbContext : DbContext
{
    public DbSet<Comment> Comments { get; set; }
    public DbSet<Category> Categories { get; set; }
}

using (var db = new MyDbContext())
{
    var blue = new Category { Name = "Blue" };
    var red = new Category { Name = "Red" };
    db.Categories.Add(blue);
    db.Categories.Add(red);

    db.Comments.Add(new Comment
    {
        Text = "Hi",
        Categories = new List<Category> { blue }
    });

    db.SaveChanges();
}
于 2012-12-07T04:20:34.370 に答える