2016-04-11 3 views
2

私はこれらのエンティティを持って、Entity Frameworkの7 RC1を使用しています:INSERT文

public class Book 
{ 
    [Key] 
    public string BookId { get; set; } 
    public List<BookPage> Pages { get; set; } 
    public Author Author { get; set; } 
    public string Text { get; set; } 
} 

public class BookPage 
{ 
    [Key] 
    public string BookPageId { get; set; } 
    public int Number { get; set; } 
} 

public class Author 
{ 
    [Key] 
    public string AuthorId { get; set; } 
    public string FullName { get; set; } 
} 

ApplicationDbContext.cspublic DbSet<Book> Books { get; set; }

で、デフォルトであります

私はこの

var book = new Book() 
{ 
    BookId = Guid.NewGuid().ToString(), 
    Pages = new List<BookPage>() 
    { 
     new BookPage() 
     { 
      BookPageId = Guid.NewGuid().ToString(), 
      Number = 1 
     } 
    }, 
    Author = new Author() 
    { 
     AuthorId = Guid.NewGuid().ToString(), 
     FullName = "Forexample" 
    }, 
    Text = "new book" 
}; 
dbContext.Books.Add(book); 
dbContext.SaveChanges(); 

ようですが例外をスローし、新しいブックを挿入しようとしている:

SqlException:INSERTステートメントがFOREIGN KEY制約 "FK_Book_Author_AuthorAuthorId"と競合しました。

この単純なインサートの問題点は何ですか? BookPageとAuthorを手動で追加する必要はありません。Entity Frameworkの仕事です。あなたのApplicationDbContextクラスで

+0

レコードがすでに存在するがかもしれません。 –

+0

@AmitKumarGhoshいいえ、データベースが空です –

+0

あなたのIDがGuidの場合、なぜ 'string'を使用するのですか?また、 'BookContext.BookPages.Add'を' BookPage'に、そして新しい 'Author'と同じようにしなければなりません。 – juharr

答えて

2

あなたはAuthorクラスのDbSetを追加する必要がありますし、BookPageクラスのため:あなたがそのようなあなたのコードを書き換えることができるように

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

    public DbSet<BookPage> BookPages { get; set; } 

    public DbSet<Author> Authors { get; set; } 

    ... 
} 

:とにかく

var author = dbContext.Authors.Add(new Author() 
{ 
    AuthorId = Guid.NewGuid().ToString(), 
    FullName = "Forexample" 
}).Entity; 

var page = dbContext.BookPages.Add(new BookPage() 
{ 
    BookPageId = Guid.NewGuid().ToString(), 
    Number = 1 
}).Entity; 


var book = new Book.Book() 
{ 
    BookId = Guid.NewGuid().ToString(), 
    Pages = new List<BookPage>(), 
    Text = "new book" 
}; 
book.Pages.Add(page); 
book.Author = author ; 
dbContext.Books.Add(book); 
dbContext.SaveChanges(); 

Guidを主キー(実際にはクラスタ化インデックス)として使用しないでください。これはSQL Serverを使用する悪い方法です。

あなたはより多くの情報のため、この記事を見てすることができます

代替が含まれる(主キーとしてID列を使用し、他の列を追加することです固有のID)にユニークな制約を設定すると、モデルは次のようになります。

public class Author 
{ 
    public Author() 
    { 
     AuthorUid = Guid.NewGuid(); 
    } 

    public int AuthorId { get; set; } 
    public Guid AuthorUid { get; set; } 
    public string FullName { get; set; } 
} 

public class Book 
{ 
    public Book() 
    { 
     BookUid = Guid.NewGuid(); 
     Pages = new List<BookPage>(); 
    } 

    public int BookId { get; set; } 
    public Guid BookUid { get; set; } 
    public List<BookPage> Pages { get; set; } 
    public Author Author { get; set; } 
    public string Text { get; set; } 
} 

public class BookPage 
{ 
    public BookPage() 
    { 
     BookPageUid = Guid.NewGuid(); 
    } 

    public int BookPageId { get; set; } 
    public Guid BookPageUid { get; set; } 
    public int Number { get; set; } 
} 

DbContext、あなたはユニーク制約を指定することができます

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

    public DbSet<BookPage> BookPages { get; set; } 

    public DbSet<Author> Authors { get; set; } 

    ... 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Author>().HasAlternateKey(a => a.AuthorUid); 
     modelBuilder.Entity<Book>().HasAlternateKey(a => a.BookUid); 
     modelBuilder.Entity<BookPage>().HasAlternateKey(a => a.BookPageUid); 
    } 
} 

をそして、そのようなあなたの新しいエンティティを追加:

using (var dbContext = new BookContext()) 
{ 
    var author = dbContext.Authors.Add(new Author() 
    { 
     FullName = "Forexample" 
    }).Entity; 

    var page = dbContext.BookPages.Add(new BookPage() 
    { 
     Number = 1 
    }).Entity; 

    var book = new Book.Book() 
    { 
     Text = "new book" 
    }; 

    book.Pages.Add(page); 
    book.Author = author; 

    dbContext.Books.Add(book); 
    dbContext.SaveChanges(); 
} 
+0

ページと著者を手動でデータベースに追加することを避けることはできますか? –

+0

どういう意味ですか?それをDbSetに追加する必要はありませんか? – Thomas

+0

はい、ブックを作成し、bookpagesとauthorを内部で作成してから、DbSetにブックのみを追加します。 –