数据库表的动态列,其值为IdentityModel

时间:2018-02-22 13:35:47

标签: c# asp.net asp.net-mvc entity-framework entity-framework-6

我有这个型号:

[Table("Book")]
public class Book
{
    [Key]
    public int BookID {get; set;}
    [Column("Title")]
    public string Title {get; set;}

    // The IsReaded column must store a Boolean value relative to the current (authorized) user.
    [NotMapped]
    public bool IsReaded {get; set;}
}

有关我使用IdentityModelUser.Identity.GetUserId ()功能收到的用户授权内容的数据。

用户是否阅读过本书的数据在以下模型(表格)中:

[Table("Readers")]
public class Reader
{
    [Key]
    public int UserId {get; set;}
    [ForeignKey("BookId")]
    public int BookId {get; set;}
}

如果在此表中有关于用户和他阅读的书籍的数据,则表示他已阅读。

我找到了一种通过存储库执行此操作的方法,描述了我将另外为IsReaded字段分配值的GetBook方法。 (https://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

但在我的项目中,Book模型将经常使用,在不同的地方我使用方法:skip,take,where和others。 而且代码有点尴尬:

public Book GetBook(int booked){
    var book = db.Books.SingeOrDefault(x=>x.BookId==booked);
    book.IsReaded = db.Readers.Any(x=>x.BookId==booked && x.UserId == User.Identity.GetUserId());
    return book;
}

public Book GetBooks(){
    var books = db.Books.ToList();
    var results = new List<Book>();
    foreach(var item in books){ 
        var book = new Book();
        book.IsReaded = db.Readers.Any(x=>x.BookId== item.BookId && x.UserId == User.Identity.GetUserId());
        results.add(book);
    }
    return results.add;
}

但是当我有这样一个方法时,这是一个问题:

var query = bookRepo.GetBooks().Where(x => x.Title != "NO").OrderByDescending(x => x.Title);
var part = new BookParts()
{
   TotalItems = query.Count(),
   Books = query.Skip(5).Take(10).ToList()
};

通过模型中的辅助上下文创建对数据库的查询看起来非常好。但它非常慢,不需要为每个模型创建额外的上下文。

[NotMapped]
public book IsReaded {
    get {
    var activeUserId = HttpContext.Current.User.Identity.GetUserId();
    using (ContextDb db = new ContextDb())
    {
        if (activeUserId != null) 
        {
            return db.Readers.Any(x=>x.UserId == activeUserId && x.BookId==BookId)
        }
     }
   }
}

我不知道最好的,有用的建议?怎么做得更好?我搜索了互联网,发现没有什么对我有用。我希望能得到帮助!

0 个答案:

没有答案