Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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#_Asp.net_Entity Framework - Fatal编程技术网

C# 用户只能喜欢一个帖子

C# 用户只能喜欢一个帖子,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个图书类,作者是ApplicationUser。在ApplicationUser类中,我有一个用户编写的书籍列表(一对多) Books类还有一个ApplicationUsers列表,用于记录喜欢的数量。但是,单个应用程序用户只能像一本书。当用户喜欢另一本书时,该书将从以前的任何书中删除 public class ApplicationUser : IdentityUser { public string Name { get; set; } public virtual

我有一个图书类,作者是ApplicationUser。在ApplicationUser类中,我有一个用户编写的书籍列表(一对多)

Books类还有一个ApplicationUsers列表,用于记录喜欢的数量。但是,单个应用程序用户只能像一本书。当用户喜欢另一本书时,该书将从以前的任何书中删除

public class ApplicationUser : IdentityUser
{
    public string Name { get; set; }

    public virtual ICollection<Book> Books { get; set; }
    public virtual ICollection<Book> Likes { get; set; } //NEW
}

public class Book
{
    public string Id { get; set; }

    public virtual ApplicationUser ApplicationUser { get; set; } //Author

    .......

    public virtual ICollection<ApplicationUser> Likes { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

         modelBuilder.Entity<Book>()
                .HasRequired<ApplicationUser>(s => s.ApplicationUser) 
                .WithMany(s => s.Books)
                .WillCascadeOnDelete(true); 

         modelBuilder.Entity<Book>() //NEW
                .HasMany<ApplicationUser>(s => s.Likes)
                .WithMany(s => s.Likes);
  }
更新:所以我按照@Alex Kudryashev的建议将Likes集合添加到ApplicationUser类中。但是我现在在迁移和更新数据库时遇到了这个错误

在表“BookApplicationUsers”上引入外键约束“FK_dbo.BookApplicationUsers_dbo.AspNetUsers_ApplicationUsers_Id”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束或索引。请参阅前面的错误


问题的原因在于您不清楚
应用程序用户
书籍
之间的关系

每个
ApplicationUser
都编写过零本或多本
书籍
,每个
书籍
都受到零本或多本
ApplicationUser
的喜爱。因此,
应用程序用户
书籍
之间的关系是多对多的

在EF代码中,首先编写如下:

class ApplicationUser
{
    public int Id {get; set;}

    // every ApplicationUser has Authored zero or more books (many-to-many)
    public virtual ICollection<Book> AuthoredBooks {get; set;}

    ... // other properties
}
class Book
{
    public int Id {get; set;}

    // every Book has been Liked by zero or more ApplicationUsers (many-to-many)
    public virtual ICollection<ApplicationUsers> Likers {get; set;}

    ... // other properties
}

class MyDbContext : DbContext
{
     public DbSet<ApplicationUser> ApplicationUsers {get; set;}
     public DbSet<Book> Books {get; set;}
}
与多对多一样,尽管创建了连接表,但在
dbContext
中没有提到它。无论何时使用ICollection,entity framework都会知道GroupJoin需要连接表

获取所有编写了非常古老书籍的年轻应用程序用户:

var result = myDbContext.ApplicationUsers
    .Where(user => user.BirtDate > new DateTime(2010, 1, 1)
    .Select(user => new
    {
         Id = user.Id,
         Name = user.Name,
         AuthoredOldBooks = user.Books
             .Where(book => book.PublicationDate < new DateTime(1900, 1, 1)
             .ToList(),
    }

您使用的是什么数据库技术?能否显示添加类似实体框架的完整代码?请先显示代码。添加了喜欢的代码。谢谢@johnw为什么喜欢的东西是由书而不是用户储存的?您当前的关系是“用户喜欢书籍”,而不是“用户喜欢书籍”。@RenanB因为我想在用户通过调用book.likes.count请求书籍时获得喜欢的数量。
likes
集合应该属于这两个类,以解决
多对多
关系。
 modelBuilder.Entity<ApplicationUser>()
     // every applicationUser has zero or more AuthoredBooks
     .HasMany(applicationUser => applicationUser.AuthoredBooks)

     // where every Book has zero or more Likers:
     .WithMany(book => book.Likers)

     // we put the many-to-many in the following junction table:
     .Map(junctionTable=>
     {
         junctionTable.MapLeftKey("ApplicationUserId");
         junctionTable.MapRightKey("BookId");
         junctionTable.ToTable("ApplicationUsersBooks");
      });
var result = myDbContext.ApplicationUsers
    .Where(user => user.BirtDate > new DateTime(2010, 1, 1)
    .Select(user => new
    {
         Id = user.Id,
         Name = user.Name,
         AuthoredOldBooks = user.Books
             .Where(book => book.PublicationDate < new DateTime(1900, 1, 1)
             .ToList(),
    }
var results = myDbContext.Books
    .Where(book => book.Genre ==  BookGenre.Software
       && book.Likers.Where(liker => liker.Gender == Gender.Female).Any());