1

我刚开始玩 CTP4 和 Code-First。我对可能的约会网站进行了以下设置:

public class User
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string LoginName { get; set; }
    [Required]
    public string Firstname { get; set; }
    [Required]
    public string Lastname { get; set; }

    public string Street { get; set; }
    [Required]
    public string Zip { get; set; }
    [Required]
    public string City { get; set; }
    [Required]
    public bool Gender { get; set; }
    [Required]
    public int SoughtGender { get; set; }
    [Required]
    public string Password { get; set; }
    [Required]
    public double Latitude { get; set; }
    [Required]
    public double Longitude { get; set; }
}

 public class Vote
{
    [Key]
    public int ID { get; set; }
    [Required]
    public User Voter { get; set; }
    [Required]
    public User TargetUser { get; set; }
    [Required]
    public int Decision { get; set; }
    [Required]
    public DateTime Timestamp { get; set; }
}

 public class MySQLContext : DbContext
{
    public MySQLContext (string constring)
        : base(constring)
    { }

    public DbSet<User> Users { get; set; }
    public DbSet<Vote> Votes { get; set; }

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Vote>().HasRequired(b => b.Voter).WithMany();
        modelBuilder.Entity<Vote>().HasRequired(b => b.TargetUser).WithMany();
        base.OnModelCreating(modelBuilder);

    }
}

现在,该框架可以很好地使用所有正确的键创建数据库。现在我插入了一些虚拟数据并启动了以下查询:

public override IEnumerable<Domain.Vote> FindVotes(Domain.User user)
    {
        var query = from v in context.Votes where v.Voter.Id == user.Id select v;
        return from v in query.AsEnumerable() select v;
    }

该查询确实返回了正确的投票实体,但投票对象的两个用户属性为空。框架不应该使用投票表中引用的用户的外键填充这些属性吗?

4

2 回答 2

10

让我给你一些关于 EF 的背景知识,以便你了解它是如何工作的。第 1 天的 EF 仅支持如下所示的显式加载

Customer.Orders.Load();

嗯,社区不欢迎反馈,开发人员想要延迟加载。为了支持延迟加载,EF 团队表示您必须将导航属性标记为虚拟。因此,在运行时,Ef 创建了一个从您的实体派生并覆盖虚拟属性的代理对象。以下是此类代码的示例。

public class Customer
{
   public string Name{get;set;}
   public virtual ICollection<Order> Orders{get;set;}
}

在运行时,有一个实现 IEntityWithChangeTracker 的代理,集合的具体类型是一个 entitycollection,它自版本 1 以来一直存在。

public class CustomerProxy:Customer,IEntityWithChangeTracker
{
private ICollection<Order> orders;
   public override ICollection<Order> Orders
   {
        if(orders == null)
       {
           orders = new EntityCollection<Order>();
           orders.Load();
       }
       return orders;
   }
}
于 2010-08-13T06:44:28.123 回答
2

将您的课程更改为以下

public class Vote {
    [Key]
    public int ID { get; set; }
    [Required]
    public virtual User Voter { get; set; }
    [Required]
    public virtual User TargetUser { get; set; }
    [Required]
    public int Decision { get; set; }
    [Required]
    public DateTime Timestamp { get; set; }
}

请注意,我已将virtual添加到 Voter && TargetUser 属性中,您应该一切顺利。

于 2010-08-11T15:08:25.343 回答