私がこれらのテーブルを持っていると仮定しましょう:
Role
- RoleId
- Name
UserRole
- UserId
- RoleId
User
- UserId
- Username
UserEmail
- UserId
- EmailId
- IsPrimary
Email
- EmailId
- Address
これで、私のモデルは次のようになります。
public class Role {
public int RoleId { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
public class User {
public int UserId { get; set; }
public string Username { get; set; }
public virtual ICollection<Role> Roles { get; set; }
public virtual ICollection<UserEmail> UserEmails { get; set; }
}
public class UserEmail {
public int UserId { get; set; }
public int EmailId { get; set; }
public bool IsPrimary { get; set; }
public virtual User User { get; set; }
public virtual Email Email { get; set; }
}
public class Email {
public int EmailId { get; set; }
public string Address { get; set; }
public virtual ICollection<UserEmail> UserEmails { get; set; }
}
これらは、この特定のケースで私がやりたい一般的で具体的なことです。
主キーを追加します。
modelBuilder.Entity<Role>().HasKey(q => q.RoleId);
これは、エンティティプロパティで属性を使用する場合と同じ効果がありますか?もしそうなら、なぜデータ注釈を使用するときにKey
わざわざ使用するのが短く、読み取り/書き込みが簡単なのですか?データアノテーションまたはFluentAPIをいつ使用するかについての規則はありますか?modelBuilder
多対多の関係を追加します。
modelBuilder.Entity<Role>()
.HasMany(q => q.Users)
.WithMany(q => q.Roles)
.Map(q => {
q.MapLeftKey("RoleId");
q.MapRightKey("UserId");
q.ToTable("UserRoles");
});
多くの関係に1つ追加します。
modelBuilder.Entity<UserEmail>()
.HasRequired(q => q.User)
.WithMany(q => q.UserEmails)
.HasForeignKey(q => q.EmailId);
最後の行は必要ですか?