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です。
この問題でかなりイライラしているので、誰かがそれを見てくれたら本当にありがたいです。
ご挨拶