0

私はこのクラスを持っています:

public class User
{
 public int Id {get; set;}
 public string Name {get; set;}
}

DBテーブル-ユーザー

public class Pet
{
 public int Id {get; set;}
 public string Name {get; set;}
}

DBテーブル-ペット

public class UsersPets
{
 public int UserId {get; set;}
 public int PetId {get; set;}
}

DBテーブル-users_pets

これまで、linqを使用してユーザーのペットを取得できます。User.Petsしかし、EFコードファーストでLinqクエリを追加せずに自動マッピングするにはどうすればよいでしょうか。

4

3 に答える 3

1

クラスを次のように変更することはできません。

public class User
{
    public User(){
        Pets = new HashSet<Pet>();
    }

    public int Id {get; set;}
    public string Name {get; set;}

    public ICollection<Pet> Pets;
}

public class Pet
{
    public Pet(){
        Users = new HashSet<User>();
    }

    public int Id {get; set;}
    public string Name {get; set;}

    public ICollection<User> Users;
}
于 2013-02-22T11:18:09.350 に答える
1

このテーブルは EF によって作成されます。モデルでは作成しないでください。そう :

public class User
{
 public int Id {get; set;}
 public string Name  {get; set;}
public ICollection<Pet> Pets  {get; set;}
} 

public class Pet
{
 public int Id {get; set;}
 public string Name {get; set;}
}

追加のテーブルがデータベースに作成され、コードで User エンティティの Pets コレクションにアクセスできます。

于 2013-02-22T14:22:28.763 に答える
1

単純な多対多の関係の場合、追加のクラスは必要ありません。UserPetクラスに 2 つのプロパティを追加するだけです。

public class User
{
    public int Id {get; set;}
    public string Name {get; set;}

    public virtual ICollection<Pet> Pets { get; set; }

    public User
    {
        Pets = new List<Pet>();
    }
}

public class Pet
{
    public int Id {get; set;}
    public string Name {get; set;}

    public virtual ICollection<User> Users { get; set; }

    public Pet
    {
        Users = new List<User>();
    }
}

PetsUsersコレクションがであることに注意してくださいvirtual。これにより、遅延読み込みが有効になり、必要のないユーザーのペットが読み込まれるのを防ぐことができます。

// Pets not loaded
var user = db.Users.Find(1);

// This loads the pets for the user (lazy loading)
foreach (var pet in user.Pets)
{
    ...
}

// This immediately loads the pets for the user (eager loading)
var user2 = db.Users.Include(u => u.Pets).SingleOrDefault(u => u.Id == 2);
于 2013-02-22T14:32:24.423 に答える