gpt4 book ai didi

c# - 如何使用 Entity Framework 7 在代码优先方法中处理这两个模型?

转载 作者:太空狗 更新时间:2023-10-30 01:18:05 26 4
gpt4 key购买 nike

问题

我正在编写概念证明 ASP.NET 5 MVC6,它将模拟一个库。我正在使用 CTP6 和 beta3。

如何使用代码优先方法在 Entity Framework 7 中定义它们之间的关系?

Shelf 和 Books 需要一个连接表。如我所见,此应用程序将一次考虑一个书架和那个书架上的书。换句话说,一个书架与书是一对多的关系。

模型

货架型号:

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

}

目标

我想实现类似 this 的东西在 ASP.NET 5 中。由于 TPH 和其他功能尚未在 EF7 中实现,我是否在正确的轨道上?

换句话说,我在想以下内容:

  • ShelfBookViewModel(毕竟我需要一个 View 模型来显示书架和书籍,或者书籍并能够导航回书架)。我可能会将其命名为 ShelfBook。这似乎是错误的做法。
  • 我希望 EF7 能够确定我有一个连接并为单独的关注点创建 View 模型。否则,这违反了 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; }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 会按照惯例为您生成所有关系,包括仅在数据库本身中可见的连接表。

但是,从您的实际模型类和围绕它们的讨论来看,您似乎真的只需要一对多,在这种情况下,您应该接受 Pynt 的回答,而忽略我的。

编辑

正如 Gert Arnold 指出的那样在评论中,EF7 目前(不再?)不支持生成的连接表,这意味着我们必须推出自己的连接表,即 probably better anyway .

如果 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; }
}

关于c# - 如何使用 Entity Framework 7 在代码优先方法中处理这两个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28837659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com