C# 实体框架:已定义具有架构的实体
在我的数据库中,我有两个表,即C# 实体框架:已定义具有架构的实体,c#,entity-framework,C#,Entity Framework,在我的数据库中,我有两个表,即Book和User,它们有一个名为BookXUser的M-to-M关系表。在关系表中,有两个字段,分别是图书和用户的外键,以及另一个名为书架的字段。由于仅使用实体框架,我无法在插入书架的同时插入M-to-M关系,因此我决定为关系表创建一个模型,定义如下: modelBuilder.Entity<Book>() .HasMany<UserData>(s => s.user)
Book
和User
,它们有一个名为BookXUser
的M-to-M关系表。在关系表中,有两个字段,分别是图书
和用户
的外键,以及另一个名为书架
的字段。由于仅使用实体框架,我无法在插入书架的同时插入M-to-M关系,因此我决定为关系表创建一个模型,定义如下:
modelBuilder.Entity<Book>()
.HasMany<UserData>(s => s.user)
.WithMany(c => c.book)
.Map(cs =>
{
cs.MapLeftKey("bookID");
cs.MapRightKey("userID");
cs.ToTable("BookXUser");
});
modelBuilder.Entity<BookXUser>()
.HasRequired<UserData>(s => s.user)
.WithMany(g => g.bookXuser)
.HasForeignKey<int>(s => s.userID);
modelBuilder.Entity<BookXUser>()
.HasRequired<Book>(s => s.book)
.WithMany(g => g.bookXuser)
.HasForeignKey<int>(s => s.bookID);
如何在将关系表保持为引用BookXUser
的模型的同时解决此错误?我的想法是,我对BookXUser模型中的虚拟方法使用延迟加载,这样我可以更轻松地获取我的书籍和用户,我还可以手动将数据插入其中,以便填充bookshelf字段
public class BookXUser : IEntityBase
{
public int ID { get; set; }
public int bookID { get; set; }
public virtual Book book { get; set; }
public int userID { get; set; }
public virtual UserData user { get; set; }
public string bookShelf { get; set; }
}
书籍
实体
public class Book : IEntityBase
{
public int ID { get; set; }
public string title { get; set; }
public string isbn { get; set; }
public int noPage { get; set; }
public string edition { get; set; }
public string bLanguage { get; set; }
public byte[] bookPic { get; set; }
public string publisherSite { get; set; }
public string bookFormat { get; set; }
public DateTime releaseDate { get; set; }
public DateTime initialReleaseDate { get; set; }
public string publisher { get; set; }
public string overview { get; set; }
public virtual ICollection<Author> author { get; set; }
public virtual ICollection<Genre> genre { get; set; }
public virtual ICollection<UserData> user { get; set; }
public virtual ICollection<Rating> rating { get; set; }
public virtual ICollection<Review> review { get; set; }
public virtual ICollection<BookXUser> bookXuser { get; set; }
public Book()
{
this.author = new HashSet<Author>();
this.genre = new HashSet<Genre>();
this.user = new HashSet<UserData>();
this.rating = new HashSet<Rating>();
this.review = new HashSet<Review>();
this.bookXuser = new HashSet<BookXUser>();
}
}
您以错误的方式定义了书籍
和用户数据
实体。正如您在问题中所说,您试图定义Book
和UserData
之间的多对多关系,因此您添加了一个连接实体BookXUser
,因为该实体拥有一个数据书架。该联接实体将按约定使用BookXUser
作为表名
此外,您还定义了两个集合:
i收集用户
在您的书籍
实体中
i收集簿
在您的UserData
实体中
您还可以在OnModelCreating
方法中使用这种流畅的配置:
modelBuilder.Entity<Book>()
.HasMany<UserData>(s => s.user)
.WithMany(c => c.book)
.Map(cs =>
{
cs.MapLeftKey("bookID");
cs.MapRightKey("userID");
cs.ToTable("BookXUser"); // <-- this is your error.
});
modelBuilder.Entity()
.HasMany(s=>s.user)
.WithMany(c=>c.book)
.Map(cs=>
{
cs.MapLeftKey(“bookID”);
cs.MapRightKey(“用户ID”);
cs.ToTable(“BookXUser”);//您以错误的方式定义了书籍
和用户数据
实体。正如您在问题中所说,您试图定义书籍
和用户数据
之间的多对多关系,因此您添加了一个联接实体BookXUser
,因为该实体拥有一个数据书架
。该联接实体y将按惯例使用BookXUser
作为表名
此外,您还定义了两个集合:
i收集用户
在您的书籍
实体中
i收集簿
在您的UserData
实体中
您还可以在OnModelCreating
方法中使用这种流畅的配置:
modelBuilder.Entity<Book>()
.HasMany<UserData>(s => s.user)
.WithMany(c => c.book)
.Map(cs =>
{
cs.MapLeftKey("bookID");
cs.MapRightKey("userID");
cs.ToTable("BookXUser"); // <-- this is your error.
});
modelBuilder.Entity()
.HasMany(s=>s.user)
.WithMany(c=>c.book)
.Map(cs=>
{
cs.MapLeftKey(“bookID”);
cs.MapRightKey(“用户ID”);
cs.ToTable(“BookXUser”);//顺便说一句,在示例代码中,您复制了modelBuilder.Entity()[…]
两次。我的错误,我复制了错误的代码。现已修复。(我仍然有错误)你能给我们看看你问题中的Book和UserData实体吗?在这里找到一个可能对你有帮助的答案:顺便说一句,在你的示例代码中,你复制了modelBuilder.Entity()[…]
两次。我的错误,我复制了错误的代码。现在修复。(我仍然有错误)你能给我们看看你问题中的Book和UserData实体吗?在这里找到一个可能对你有帮助的答案:在修改一些方法并用你的建议替换所有内容后,错误消失了。非常感谢:)。在修改一些方法并用你的建议替换所有内容后,错误消失了。非常感谢:)。
modelBuilder.Entity<Book>()
.HasMany<UserData>(s => s.user)
.WithMany(c => c.book)
.Map(cs =>
{
cs.MapLeftKey("bookID");
cs.MapRightKey("userID");
cs.ToTable("BookXUser"); // <-- this is your error.
});