2つのPOCOオブジェクトに複数の関係(または場合によっては外部キー)を適用する際に問題が発生します。私は多対多の最初の関係を持っており、データベースが作成されると、関係に必要な3つのテーブル(Projects、Users、ProjectsUsers)が作成されます。
これまでのコード:
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? CompletionDate { get; set; }
public bool Deleted { get; set; }
public ICollection<User> Users { get; set; }
}
public class User
{
public User()
{
Name = new Name();
}
public int UserId { get; set; }
public string LoginId { get; set; }
public string Password { get; set; }
public Name Name { get; set; }
public ICollection<Project> ManagedProjects { get; set; }
}
public class ProjectConfiguration : EntityTypeConfiguration<Project>
{
public ProjectConfiguration()
{
HasMany(x => x.Users)
.WithMany(x => x.ManagedProjects);
}
}
public UserConfiguration()
{
HasMany(x => x.ManagedProjects)
.WithMany(x => x.Users);
}
次に、Project.ManagingUser->Userのオプションの1対1の関係を追加します。ただし、構成でこれを示す方法がわからないようです。
私が必要だと思うもののコード:
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? CompletionDate { get; set; }
public bool Deleted { get; set; }
public int? ManagingUserId { get; set; }
public User ManagingUser { get; set; }
public ICollection<User> Users { get; set; }
}
Userオブジェクトを変更する必要はないと思います。
これは、新しい関係をマッピングする最後の試みを示しています。
public ProjectConfiguration()
{
HasMany(p => p.Users)
.WithMany(u => u.Projects);
this.HasOptional(p => p.ManagingUser)
.WithOptionalDependent()
.Map(m=>m.MapKey("ManagingUserId"))
.WillCascadeOnDelete(false);
}
データベースが作成されたときに何が起こっているのか、私は2つのテーブル(プロジェクトとユーザー)だけになりました。そして、それは1対1の関係を設定しようとしているだけのようです。
誰かが私が欠けているものを教えてもらえますか?
リチャード私はUserConfigurationを変更していません。以下は、DbContextです。
public class MyDbContext : DbContext
{
public MyDbContext() : base(Properties.Settings.Default.ConnectionString)
{
}
public DbSet<User> Users { get; set; }
public DbSet<Project> Projects { get; set; }
}