1

これがどこかに答えられている場合は事前に申し訳ありませんが、私は周りを検索して答えを見つけることができませんでした.

UserProfile テーブルと Reviewer テーブルをリンクしようとしています。レビュアーはアプリケーション内のユーザーの一種であるため、2 つのテーブル間の関係は 1 (UserProfile) 対 0/1 (レビュアー) です。

UserProfile モデルは次のとおりです。

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }

    public virtual Reviewer Reviewer { get; set; }
} 

レビュアー クラス:

public class Reviewer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    [ForeignKey("UserProfile")]
    public int ReviewerID { get; set; }

    public string Email { get; set; }
    // other properties of Reviewer...

    public virtual UserProfile UserProfile { get; set; }

}

つまり、外部キー UserId をテーブル Reviewer のキーとして、名前を ReviewerID として設定しようとしています。

流暢な API を次のように指定します。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        // other fluent API...

        modelBuilder.Entity<UserProfile>()
                .HasOptional(x => x.Reviewer).WithRequired(x => x.UserProfile);

    }

しかし、Code First によって生成されたデータベースは、私が望んでいたものとはまったく異なります。

UserProfile テーブルに次のエントリがあるとします: UserId = 4、UserName = lostman1

Reviewer テーブルに新しいレコードを手動で挿入しようとしました: ReviewerID = 4、E メール = d@d.com

自動インクリメント フィールドであるため、データベースの ReviewerID フィールドを更新できないことがわかりました。さらに、次のエラーが表示されます。

行 4 のデータはコミットされませんでした。
エラー ソース: SQL Server Compact ADO.NET データ プロバイダー。
エラー メッセージ: 対応する主キー > 値が存在しないため、外部キー値を挿入できません。[外部キー制約名 = FK_dbo.Reviewer_dbo.UserProfile_ReviewerID]

コードの最初のセットアップの何が問題になっていますか? どうもありがとう!

4

2 に答える 2