【发布时间】:2018-07-18 02:22:03
【问题描述】:
我有一个以 ApplicationUser 作为作者的 Books 类。在我的 ApplicationUser 类中,我有一个用户创作的书籍列表(一对多)。
Books 类还有一个 ApplicationUsers 列表,用于记录喜欢的数量。但是,单个 ApplicationUser 只能喜欢一本书。当用户喜欢另一本书时,喜欢的内容将从任何以前的书籍中删除。
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);
}
一定是关系有问题。单个用户只能喜欢一本书。但是一个用户应该能够喜欢很多书。
book.Likes.Add(user);在检查用户是否存在对该书的“点赞”后,简单地添加了一个点赞。
但是 Book 和创建 Book 的 ApplicationUser 之间的一对多关系必须存在。但它们对 ApplicationUser 和 Likes 之间的关系没有要求。
[ResponseType(typeof(void))]
public IHttpActionResult Like(string bookid, bool action)
{
Book book = db.Books.Find(bookid);
var user = UserManager.FindById(User.Identity.GetUserId());
if (book == null || user == null)
return BadRequest();
if (action)
{
if (!book.Likes.Contains(user))
book.Likes.Add(user);
}
else
{
if (book.Likes.Contains(user))
book.Likes.Remove(user);
}
//db.Entry(book).State = EntityState.Modified;
try {
db.SaveChanges();
}
catch (Exception e) {
throw;
}
return StatusCode(HttpStatusCode.NoContent);
}
更新:所以我按照@Alex Kudryashev 的建议将 Likes 集合添加到 ApplicationUser 类中。但是我现在在迁移和更新数据库时遇到了这个错误。
在表“BookApplicationUsers”上引入 FOREIGN KEY 约束“FK_dbo.BookApplicationUsers_dbo.AspNetUsers_ApplicationUser_Id”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束或索引。查看以前的错误。
【问题讨论】:
-
您使用什么数据库技术?你能显示添加喜欢的完整代码吗?
-
实体框架,代码优先。添加了喜欢的代码。谢谢@john
-
为什么点赞是由书籍而不是用户存储的?您当前的关系是“用户喜欢图书”而不是“用户喜欢图书”。
-
@RenanB 因为我想在用户通过调用 book.Likes.Count 请求一本书时获得点赞数。
-
Likes集合应该属于这两个类来解析many-to-many关系。
标签: c# asp.net entity-framework