实体框架中具有其他属性的一对多

时间:2015-10-31 00:24:15

标签: c# entity-framework

我是EF的新手并且有一个非常基本的问题。有人可以使用Code First方法建议如何实现以下场景吗?

    public class Book
    {
       public int Id {get; set;}
       public string title {get; set;}
       public string author {get; set;}
       public DateTime DateBorrowed {get; set;}
       public DateTime DateReturned {get; set;}

       public virtual User Borrower {get;set;}
    }
    public class User
    {
       public int Id {get;set;}
       public string UserName {get;set;}
       public string Email {get; set;}

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

我想保持Book和User类/底层表每次都保持一个唯一的记录集合。换句话说,我们如何在单独的类中分隔DateBorrowed和DateReturned属性,以便在单独的SQL表中维护书籍借用和返回事务。

1 个答案:

答案 0 :(得分:0)

当前设置只允许每本书有一个单独的记录,说明它何时被借用以及何时返回。每次借用或退回时,它都会覆盖最后一个。您可能希望做的更多是创建一个包含两个日期的类,然后将该类作为Book表中的外键引用。

您当前的表格可能会如此变化(代码未经过测试):

public class Book
{
   public int BookId {get; set;}
   public string title {get; set;}
   public string author {get; set;}

   public virtual ICollection<BorrowingRecord> BorrowingRecords { get; set; }

   public int UserId { get; set; }
   public virtual User Borrower {get;set;}
}

public class BorrwingRecord
{
    public int BorrowingRecordId {get; set; }
    public DateTime DateBorrowed {get; set;}
    public DateTime DateReturned {get; set;}

    public int BookId { get; set; }
    public virtual Book Book { get; set; }
}

public class User
{
   public int UserId {get;set;}
   public string UserName {get;set;}
   public string Email {get; set;}

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

您对User表已有正确的想法。只需建立连接,你就可以了。

您正在寻找的是一对多的关系。有关详细信息,请参阅此页面:https://msdn.microsoft.com/en-us/data/jj713564.aspx

以下是您如何获取特定用户借阅的图书以及这些图书的借阅记录(代码未经过测试并假设您已设置上下文)的示例:

var booksForUser = context.Books.Where(b => b.UserId == GivenUserID);

foreach(var book in booksForUser)
{
    var borrowingRecordForBook = context.BorrowingRecords.Where(br => br.BookId == book.BookId);

    // do what you need with this data.
}