1

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

1 に答える 1

2

あなたはおそらくWithMany代わりに欲しいでしょうWithOptionalDependent-それは1対1ではなく1対多の関係です。

HasOptional(p => p.ManagingUser)
   .WithMany()
   .HasForeignKey(m => m.ManagingUserId)
   .WillCascadeOnDelete(false);

編集
私はあなたがクラスOnModelCreatingからオーバーライドを逃していると思います:DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);
   modelBuilder.Configurations.Add(new ProjectConfiguration());
   modelBuilder.Configurations.Add(new UserConfiguration());
}
于 2012-11-30T17:23:28.627 に答える