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);

    }
}

これで、フレームワークはすべての適切なキーを使用してDBを作成するという素晴らしい仕事をします。ここで、ダミーデータを挿入し、次のクエリを起動しました。

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;
    }

クエリは適切なVoteエンティティを返しますが、Voteオブジェクトの2つのUserプロパティはNullです。フレームワークは、投票テーブルで参照されているユーザーの外部キーをこれらのプロパティに入力する必要がありますか?

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を実装するプロキシがあり、コレクションの具体的なタイプは、バージョン1以降に存在するentitycollectionです。

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; }
}

投票者&&TargetUserプロパティに仮想を追加したことに注意してください。これで、準備は完了です。

于 2010-08-11T15:08:25.343 に答える