Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架:已定义具有架构的实体_C#_Entity Framework - Fatal编程技术网

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