わかりました、答えが見つかりました。少し複雑なので、気に入るかどうかわかりません。
上記のテーブル構造を取得するには、SystemUserAccount を多対多として作成する必要があります。次に、SystemUserAccount テーブルの UserId 列に別の一意のキーを作成する必要があります。これを実行するために見つけた唯一のフックは、DBInitializer の Seed メソッドでした。コードは次のとおりです。
public class SystemUser
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<SystemUserAccount> SystemUserAccounts{get;set;}
}
public class Account
{
public int Id { get; set; }
public ICollection<SystemUserAccount> SystemUserAccount { get; set; }
}
public class SystemUserAccount
{
public int UserId { get; set; }
public int AccountId { get; set; }
public virtual ICollection<AccountRole> AccountRoles { get; set; }
public SystemUser SystemUser { get; set; }
public Account UserAccount { get; set; }
}
public class AccountRole
{
public int Id { get; set; }
public String Name { get; set; }
public virtual ICollection<SystemUserAccount> UserAccounts { get; set; }
}
次に、このコンテキスト:
public DbSet<SystemUser> SystemUser { get; set; }
public DbSet<SystemUserAccount> SystemUserAccount { get; set; }
public DbSet<Account> Account { get; set; }
public DbSet<AccountRole> AccountRole { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<SystemUserAccount>()
.HasKey(sua => new { sua.UserId, sua.AccountId });
modelBuilder.Entity<SystemUserAccount>()
.HasRequired(sua => sua.SystemUser)
.WithMany(u => u.SystemUserAccounts)
.HasForeignKey(u => u.UserId);
modelBuilder.Entity<SystemUserAccount>()
.HasMany(sua => sua.AccountRoles)
.WithMany(ar => ar.UserAccounts)
.Map(m =>
{
m.ToTable("UserAccountRole");
m.MapLeftKey("UserId", "AccountId");
m.MapRightKey("AccountRoleId");
}
);
}
最後に、データベース初期化子のシード メソッドで:
public class DatabaseInitializer : DropCreateDatabaseAlways<PeopleContext>
{
protected override void Seed(PeopleContext context)
{
context.Database.ExecuteSqlCommand("ALTER TABLE SystemUserAccounts ADD CONSTRAINT uc_User UNIQUE(UserId)");
}
}
次に、プログラムで DatabaseInitializer を呼び出します。
Database.SetInitializer<PeopleContext>(new DatabaseInitializer());
これにより、OPに示されているテーブル構造が得られます。クエリでどのように動作するかはまだわかりません。
これをやろうとしている人に役立つことを願っています。
タル