Code First /FluentAPIを使用して2つのエンティティをEntityFrameworkCTP5と一緒にマッピングするのに問題があります。このデータベースは、当社が切り替えている別のアプリケーション(Exact MAX)の古いデータベースであり、倉庫での出荷を管理するために自分で使用するアプリケーションを作成しています。この投稿で言及されているエンティティを含む古いデータベースには何も保存されません。
エンティティは、アドレスが1つしかないSalesOrderと、多数のSalesOrderを持つことができるAddressです。列名を指定する必要があり、それが問題の1つです。もう1つは、アドレスに、SalesOrderの一致する列にリンクする顧客IDとアドレスIDの2つのキーがあることです。列名は恐ろしいものです。SalesOrdersのテーブルSO_MasterのCUSTID_27とSHPCDE_27、アドレスのテーブルSHIPPING_MASTERのCUSTID_24とSHPCDE_24です。
私は結局昨夜遅くあきらめました。この投稿のコード行はSalesOrderのマップからのものであり、最後の2つの部分はSalesOrderとAddressをマッピングするためのものです。Google検索から一緒にスクラップした各キーのマッピングがありますが、2つの別々のパスとして実行する必要があるかどうかさえわかりません。取得されたアドレスレコードはそれ自体でOKですが、SalesOrdersのレコードはそうではありません。取得された1つのSalesOrderレコードには有効な住所がありましたが、残りのSalesOrdersにはnullの住所がありました。
this.ToTable("SO_Master");
this.HasKey(so => so.Id);
this.Property(so => so.OrderDate).HasColumnName("ORDDTE_27");
this.Property(so => so.Id).HasColumnName("ORDNUM_27");
// Maps Customers
this
.HasOptional(s => s.Customer)
.WithMany(c => c.SalesOrders)
.IsIndependent()
.Map(m => m.MapKey(c => c.Id, "CUSTID_27"));
// Maps Address
this
.HasOptional(s => s.Address)
.WithMany(a => a.SalesOrders)
.IsIndependent()
.Map(m => m.MapKey(a => a.CustomerId, "CUSTID_27"));
this
.HasOptional(s => s.Address)
.WithMany(a => a.SalesOrders)
.IsIndependent()
.Map(m => m.MapKey(a => a.Id, "SHPCDE_27"));
必要に応じて、データ注釈を使用しても問題はありません。代わりにLINQtoSQLを使用することもできますが、これを使用した解決策があるかどうかを確認したいと思います。EFはこのデータベースに最適な選択ではないかもしれませんが、コードは十分に分離されているため、実験することができます。VisualStudioExpressとSQLServerExpress 2008 R2を使用していますが、デザイナーを使用できるものが見つからなかったため、CodeFirstを使用しています。
この投稿をお読みいただき、ありがとうございます。
OK、私はデータ注釈を使用するというVulgarbinaryの提案を採用し、必要な場所でForeignKey属性を使用することになりました。それでも、FluentAPIを使用してアドレスを顧客にマッピングする必要がありました。正確な理由はわかりません。住所レコードは、FluentAPIマッピングなしで空の顧客とともに戻ってきました。アドレスに注文とアドレスをリンクするためのキーが2つありますが、顧客がアドレスマッピングに使用するためのキーは1つしかないためだと思います。
this.HasRequired(a => a.Customer).WithMany().HasForeignKey(a => a.CustomerId);
Fluent APIの使い方はもう少しよく理解できたと思いますが、明らかにもっと読む必要があります。戻って一部の属性をFluent行に戻すことはできるかもしれませんが、作業中のアプリケーションにとってはそれだけの価値はありません。