1

親オブジェクト book があり、そのオブジェクトのプロパティは publisher です。本を宣伝するたびに、出版社が既に存在する場合でも、新しい出版社が追加されます。本を追加する方法を誰か教えてもらえますか? 出版社を再度追加する代わりに、既存の本を参照するだけですか? 私が使用しているコードは以下のとおりです...よろしくお願いします!

public class Book
{
    public int BookID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime CreateDate { get; set; }

    public virtual Publisher Publisher { get; set; }
}

public class Publisher
{
    public int PublisherID { get; set; }
    public string Address { get; set; }
}

public class SqlCEDataStore : DbContext
{
    public DbSet<Book> Books { get; set; }
    public DbSet<Publishers> Publishers { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.IncludeMetadataInDatabase = false;
    }
}

public class TimeSinkRepository : IRepository<Book>
{
    private static SqlCEDataStore context = new SqlCEDataStore();

    public int Add(Book entity)
    {
        context.Books.Add(entity);
        return context.SaveChanges();
    }
}

var book = new Book()
{
      Title = "New Title",
      Description = "New Description",
      CreateDate = DateTime.Now,
      Publisher = new Publisher() { PublisherID = 1 }
};

var repository = new BookRepository();
var result = repository.Add(book);
4

3 に答える 3

0

問題は次のとおりです。

Publisher = new Publisher() { PublisherID = 1 }

オブジェクトコンテキストは、これが既存のパブリッシャーであることを認識していません。これは新しく作成されたエンティティであるため、オブジェクトコンテキストは挿入操作を実行します。パブリッシャーオブジェクトが新しく作成されていないことをオブジェクトコンテキストと言う必要があります。これを行う1つの方法は、Addメソッドを変更することです。

public int Add(Book entity)
{
  context.Books.Add(entity);

  // 0 means new one, other values mean existing one
  if (entity.Publisher.PublisherID > 0)
  {
    context.ObjectStateManager.ChangeObjectState(entity.Publisher, EntityState.Unchanged);
  }

  context.SaveChanges();
}
于 2010-08-26T21:53:13.613 に答える
0

問題はこの行にあります Publisher = new Publisher() { PublisherID = 1 }

次のような fetch メソッドを実行する必要があります - コンテキストから必要な Publisher を取得します (例: id = 1 の場合) - 返されたオブジェクトを新しい書籍オブジェクトの発行者として設定します - コンテキストは残りを整理する必要があります。本を保存するとき。(オブジェクト状態マネージャーをいじる必要はありません)

頑張ってください。これが機能しない場合は、コードをいくつか載せてください。私がお手伝いします。

于 2013-01-23T13:56:43.403 に答える
0

Book エンティティを追加する前に、Publisher が Publishers コンテキストにアタッチされていることを確認することで、これを解決できます (この方法では、追加する必要がある新しいものではなく、dbcontext からの Publisher であることがわかります)。

context.Publishers.Attach(book.Publisher); // This is only possible if the Publisher is not new
context.Books.Add(book);
于 2011-01-12T18:47:55.563 に答える