以下の可能な解決策のセクションを確認してください
外部キー関係に問題があります - ここに私のテーブルがあります:
public class Lead
{
[Key]
public int LeadId { get; set; }
public int? CustomerId { get; set; }
[ForeignKey("CustomerId")]
public virtual Customer Customer { get; set; }
}
public class Customer
{
[Key]
[Column("customer_id")]
public int CustomerId { get; set; }
[ForeignKey("CustomerId")]
public virtual Lead Lead { get; set; }
}
次のエラーが表示されるという問題があります。
Unable to determine the principal end of an association between the types 'Sales.Customers.Customer' and 'Sales.Leads.Lead'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.
モデルビルダーに関係を追加しようとしましたが、正しく機能していないようです。エラーメッセージが表示されなくなった場合、実際にLead.LeadId -> Customer.CustomerId
は をリレーションシップではなくLead.CustomerId -> Customer.CustomerId
リレーションシップとして使用しています。
Stackoverflow で同様の質問を確認しましたが、DB 構造と一致していないようで、提案を実装しようとしても関係が正しく機能しません。
それは本当に奇妙です-これについて助けていただければ幸いです!
アップデート
したがって、この関係を機能させるために、次の方法でキーを切り替えました。
public class Lead
{
[Key]
public int LeadId { get; set; }
[ForeignKey("LeadId")]
public virtual Customer Customer { get; set; }
}
public class Customer
{
[Key]
[Column("customer_id")]
public int CustomerId { get; set; }
public int? LeadId { get; set; }
[ForeignKey("LeadId")]
public virtual Lead Lead { get; set; }
}
しかし、同じエラーで、まだ運がありません。なぜこの関係が機能しないのか、私は本当に途方に暮れています。私には、それはかなり簡単に思えます。
更新 2
わかりました-これをいじって無駄な時間を過ごした後、私は少し異なるアプローチを試みました:
これが私の新しいクラスです....
public class Lead
{
[Key, ForeignKey("Customer")]
public int LeadId { get; set; }
public virtual Customer Customer { get; set; }
}
public class Customer
{
[Key]
[Column("customer_id")]
public int CustomerId { get; set; }
public int? LeadId { get; set; }
public virtual Lead Lead { get; set; }
}
上記のコードでエラー メッセージが表示されなくなりました。唯一の問題は、作成している関係エンティティ フレームワークが、Customer.LeadId と Lead.LeadId ではなく、Customer.CustomerId と Lead.LeadId の間にあることです。
考えられる解決策
わかりました-さらに調査した後、この投稿に出くわしました: EF Code First - 1-to-1 Optional Relationship
クラスを次のように変更しました。
public class Customer
{
[Key]
[Column("customer_id")]
public int CustomerId { get; set; }
public virtual Lead Lead { get; set; }
}
public class Lead
{
[Key]
public int LeadId { get; set; }
public virtual Customer Customer { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().HasOptional<Lead>(l => l.Lead).WithOptionalDependent(c => c.Customer).Map(p => p.MapKey("LeadId"));
base.OnModelCreating(modelBuilder);
}
すべてがうまく機能します!しかし、大きな問題が 1 つ...
顧客テーブルから LeadId プロパティを削除する必要がありました....そのため、割り当て先の LeadId プロパティがない場合、新しい顧客を作成するときに (適切な場合に) LeadId を割り当てる方法がわかりませんか?