2

EFコードファーストを使用してデータベースからオブジェクトを取得しようとすると、いくつかの問題が発生します。私が使用しているプログラムはVisualStudio2010で、プロジェクトの種類はASP.NETMVC3プロジェクトです。

現在、問題は、FKがデータベースで適切に構成されていても、関連付けられたオブジェクトが常にnullであるということです。

具体的なシナリオ:ユーザーにはチームがあり(オプション)、チームにはユーザーがいます(Users.Countはゼロにすることができます)。これで、特定のユーザーでWebアプリにログオンすると、そのチームの他のユーザーを表示できるようになります。問題は、ログオンしているユーザーのTeamオブジェクトがnullであるということです。User(int?teamId)で外部キーを使用し、この外部キーを使用して適切なチームを割り当てる回避策を見つけました。ただし、この方法を使用せずに問題を解決する必要があります。私のコード:

public class Team
    {
    [Key]
    public int Id { get; set; }
    [MaxLength(100)]
    public string Name { get; set; }
    public virtual ICollection<User> UsersInTeam { get; set; }

    public Team()
    {
        UsersInTeam = new List<User>();
    }

    public void AddUser(User user)
    {
        if(UsersInTeam.Contains(user))
            throw new ArgumentException(String.Format("Cannot add {0} to {1} because the user is already assigned to that team", user.Name, Name));

        user.Team = this;
        UsersInTeam.Add(user);
    }

 public class User
 {
    public int Id { get; set; }
    [Required, MaxLength(100)]
    public string Email { get; set; }
    [Required, MaxLength(100)]
    public string Password { get; set; }
    [Required, MaxLength(100)]
    public string Name { get; set; }
    [Required, MaxLength(100)]
    public string FirstName { get; set; }
    public string Mobile { get; set; }
    public bool IsAdminstrator { get; set; }
    public virtual Team Team { get; set; }

    public User()
    {
        Team = new Team();
    }
}

マッピングについて:

modelBuilder.Entity<Team>().HasMany(t => t.UsersInTeam).WithOptional(u => u.Team).Map(m => m.MapKey("TeamId")).WillCascadeOnDelete(false);
modelBuilder.Entity<User>().HasOptional(u => u.Team).WithMany(u => u.UsersInTeam).Map(m => m.MapKey("TeamId")).WillCascadeOnDelete(false);

したがって、ログインした後、user.Teamがnullであることを除いて、DBからのすべての適切な属性を持つUserオブジェクトがあります。データベースでは、Userテーブルには外部キー列TeamIdがあり、ユーザーには対応するteamIdがありますが、それでもTeamは常にnullです。

この問題でかなりイライラしているので、誰かがそれを見てくれたら本当にありがたいです。

ご挨拶

4

2 に答える 2

1

クエリにチームを含める

Users.Include(e => e.Team)
于 2012-05-18T22:08:31.890 に答える
1

を使用して熱心な読み込み.Includeを行っています。クエリの後にこれを行うことで、明示的なロードを行うこともできます。

var User = context.Users.Find(id); // Load the User.
context.Entry(User)
    .Reference(u => u.Team)
    .Load();

また、次のこともできます。

var Team = context.Teams.Find(id);
context.Entry(Team)
    .Collection(t => t.Users)
    .Load();

関連エントリーをロードしました!:)

于 2012-05-18T22:25:52.990 に答える