6

私は Entity Framework 5 と MVC 4 を使用しており、.NET 4.5 では Code First の移行を使用しています。1 対 0 または 1 の関係にある 2 つのエンティティ間に外部キーがあります。Jogger のレコードを作成しようとすると、すべてが失敗します。次のいずれかのエラー メッセージが表示されます。

  • 外部キーが null 参照です
  • dbo.Jogger が存在しません
  • 未処理の例外 ... メタデータがありません。

EF Viewer を実行すると、ナビゲーション関係は完璧です。現在、Fluent API コードは使用されていません。

ユーザークラス

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

    // Other properties

    public int? JoggerId { get; set; }
    public virtual Jogger Jogger { get; set; }

ジョガークラス

    [ForeignKey("UserId")]
    public int JoggerId { get; set; }

    public virtual UserProfile UserId { get; set; }

JoggerController が生成されると、Get メソッドと Post メソッドに対して次のコードが生成されます。

// GET: /Jogger/Create

    public ActionResult Create()
    {
        ViewBag.JoggerId = new SelectList(db.UserProfiles, "UserId", "UserName");
        return View();
    }

    //
    // POST: /Jogger/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Jogger jogger)
    {



        if (ModelState.IsValid)
        {
            db.Jogger.Add(jogger);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.JoggerId = new SelectList(db.UserProfiles, "UserId", "UserName", jogger.JoggerId);
        return View(jogger);
    }

Jogger/Create ビューには、生成されたコードによると、JoggerId または UserId のフィールドはありません。

通常、出力が JoggerId = 0 および UserId = null を示すコードの (ModelState.IsValid) 部分で失敗します。

この動作は、asp.net の Web サイトにある Contoso University のチュートリアルでは見たことがなく、MSDN Learn EF サイトも確認しました。この問題を解決できないようです。あなたのアドバイスをいただければ幸いです。

4

3 に答える 3

2

エラーはデータベース モデルにあります。Entity Framework Code First では、常に 1 対 1 の関係の構成が必要です。Code First は、これらの状況でどのクラスが依存しているかを判断できません。

1- Jogger クラスに次のプロパティを追加します。

public virtual User User { get; set; }

2 - OnModelCreating メソッドに以下を追加します。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
      // One to One relationship
      modelBuilder.Entity<User>()
                        .HasOptional(t => t.Jogger)
                        .WithOptionalDependent(m => m.User);
}
于 2013-08-03T03:34:13.283 に答える
1

エラーは次のとおりです。

public virtual UserProfile UserId { get; set; }

Entity Framework Code First は規則に対応しており、そのうちの 1 つは名前ベースの規則です。つまり、プロパティ「UserId」がある場合、テーブル「User」が検索され、そのテーブルへの外部キーとして構成されます。ナビゲーション プロパティに、外部キー プロパティに従来から使用されている名前を付けたため、爆発していると思います。

正しい作業方法は次のとおりです。

public virtual int? UserId { get; set; }
public virtual User User { get; set; }

プロパティの名前を「UserProfileId」にする場合は、「ForeignKey」属性または流暢な構成構文を使用して、これが外部キーであることを Entity Framework に知らせる必要があります。

public virtual int? UserProfileId{ get; set; }

[ForeignKey("UserProfileId")
public virtual User User { get; set; }

または流暢な構文で (これを Context の OnModelCreating メソッド、または EntityTypeConfiguration から継承する別のクラスに記述します):

HasRequired(j => j.User).WithMany().HasForeignKey(i => i.UserProfileId)

編集: User テーブルが実際には UserProfile と呼ばれていることに気付きました。これは、私の応答の後半を意味のないものにします。それでも、教育的である可能性があるため、そのままにしておきます。

于 2013-08-02T09:08:46.720 に答える