2

私がこれらのテーブルを持っていると仮定しましょう:

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);

最後の行は必要ですか?

4

1 に答える 1

2

はい、そのHasKeyメソッドは属性と同じ効果があり[Key]ます。ModelBuilder実行する構成がたくさんあり、すべてをメソッドに保持することを好む場合があります。一方、属性をほとんど使用しないか、一部の属性を使用することを好む場合があります。柔軟性があります。

あなたが話しているなら:

.HasForeignKey(q => q.EmailId);

次に、あなたの場合、はい、それは必須です。なんで?UserEmailエンティティに独自の外部キープロパティを作成したためです。プロパティを削除した場合は、この行を削除すると、EFがデータベースに。という名前の行を作成しますEmail_Id。ナビゲーションプロパティを介してこれにアクセスすることもできますinstanceOfUserEmail.Email.EmailId

于 2012-09-20T10:16:05.043 に答える