Entity Framework 7を使用したコードの最初のアプローチでは、これら2つのモデルをどのように扱いますか?

asp.net-core c# entity-framework entity-framework-core jointable

質問

問題

私は、ライブラリをシミュレートするASP.NET 5 MVC6の概念を証明しています。私はCTP6とベータ3を使用しています。

どのようにコードを最初のアプローチを使用してEntity Framework 7での関係を定義するには?

ShelfとBooksには結合テーブルが必要です。私が見ているように、このアプリケーションでは、一度に1つのシェルフとその自己に関する書籍を検討します。言い換えれば、ある棚は本と1対1の関係を持っています。

モデル

シェルフモデル:

public class Shelf
{
    public int ShelfId { get; set; }

    public string ShelfName { get; set; }

    public ShelfType MyProperty { get; set; }

    public virtual List<Book> Books { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

ブックモデル:

public class Book
{
    public int BookId { get; set; }

    public string BookName { get; set; }

    public string BookAuthor { get; set; }

    public string BookGenre { get; set; }

    public DateTime BookPublishedDate { get; set; }

    public string Description { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

ゴール

私はASP.NET 5でこのようなものを実装したいと思います.TPHやその他の機能はまだEF7では実装されていないので、正しい軌道に乗っていますか?

つまり、私は次のことを考えています。

  • ShelfBookViewModel(やはり、棚や本、または本を見せたり、棚に戻ったりするためにビューモデルが必要です)。私はおそらくそれをShelfBookという名前にします。これは間違ったアプローチだと思われます。
  • 私は、EF7が私が参加し、別の懸念のためにビューモデルを作成していることを理解できることを望んでいます。さもなければ、これはSOLIDコード実践の違反です。以下のようなもの(以前のリンクから)。
  • 結合テーブルはまだEF7では実装されていません。私は無駄なことを求めていますか?

私は次のように仕事をすることができませんでした:

 modelBuilder.Entity<Shelf>() 
            .HasMany(p => p.Shelfs) 
            .WithMany(t => t.Books) 
            .Map(mc => 
               { 
                   mc.ToTable("ShelfJoinBook"); 
                   mc.MapLeftKey("ShelfId"); 
                   mc.MapRightKey("BookId"); 
               });

私の質問を読んでいただきありがとうございます。私は他の人がこれを役に立つと思う。

人気のある回答

多対多に関する質問に答えるには、以下のようにマッピングを定義する必要があります(そして、必ずモデルクラスを更新してください)。

modelBuilder.Entity<Shelf>() 
    .HasMany(p => p.Books) 
    .WithMany(t => t.Shelves) // doesn't exist 
    .Map(mc => 
       { 
           mc.ToTable("BookShelves"); 
           mc.MapLeftKey("ShelfId"); 
           mc.MapRightKey("BookId"); 
       });

ICollection<Shelf> Shelves { get; set; }を追加する必要がありますICollection<Shelf> Shelves { get; set; }Book 。しかし、そうした場合、次のようになります(これは私のMCVEの例です)。

public class Shelf
{
    public int ShelfId { get; set; }
    public virtual ICollection<Book> Books { get; set; }
}

public class Book
{
    public int BookId { get; set; }
    public virtual ICollection<Shelf> Shelves { get; set; }
}

とにかくマッピングは必要ありません。なぜなら、EFは、データベース自体でしか見えない結合テーブルを含めて、慣例によってすべての関係を生成するからです。

しかし、あなたの実際のモデルクラスとそれらの周りの議論から、あなたは本当に1対多が必要だと思われます。その場合、Pyntの答えを受け入れ、私のことを無視するべきです。

EDIT

で指摘したようにゲルト・アーノルドコメントで、EF7は現在、(もはや?)私たちがしている、私たち自身をロールバックする必要がありますを意味し、テーブルを結合生成をサポートしていませんとにかく、おそらくより良いです

EFがもはや私のためにそれらをしないならば、私は自分自身、単純な、今からテーブルを結合するかもしれないと思う方法です(警告 - 私はこの問題のループを閉じることを試みています...私はそうではありませんコンパイラでこれを試してみると気になりますので、YMMV):

public class Shelf
{
    public int ShelfId { get; set; }
    public virtual ICollection<BookShelf> BookShelves { get; set; }
    public virtual IQueryable<Book> Books
    {
        get
        {
            return BookShelves.Where(s => s.ShelfId == ShelfId)
                              .Select(s => s.Book);
        }
    }
}

public class Book
{
    public int BookId { get; set; }
    public virtual ICollection<BookShelf> BookShelves { get; set; }
    public virtual IQueryable<Shelf> Shelves
    {
        get
        {
            return BookShelves.Where(s => s.BookId == BookId)
                              .Select(s => s.Shelf);
        }
    }
}

public class BookShelf
{
    [Key]
    public int BookId { get; set; }
    [ForeignKey("BookId")]
    public Book Book { get; set; }
    [Key]
    public int ShelfId { get; set; }
    [ForeignKey("ShelfId")]
    public Shelf Shelf { get; set; }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ