2011-12-04 2 views
7
public class Client 
{ 
    public Int32 ClientID { get; set; } 

    public virtual ICollection<Inquiry> InquiryManufacturers { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<Inquiry> InquiryRetailers { get; set; } 
} 

public class Product 
{ 
    public Int32 ProductID { get; set; } 

    public Int32 ClientID { get; set; } 
    public virtual Client Client { get; set; } 

    public virtual ICollection<Inquiry> Inquiries { get; set; } 
} 

public class Inquiry 
{ 
    public Int32 InquiryID { get; set; } 

    public Int32 ProductID { get; set; } 
    public Int32 ManufacturerID { get; set; } 
    public Int32 RetailerID { get; set; } 
    public virtual Product Product { get; set; } 
    public virtual Client Manufacturer { get; set; } 
    public virtual Client Retailer { get; set; } 
} 

流暢APIは、だからここ最初に必須リレーションシップをオプションにしますか?

HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID); 
HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID); 

ようである私が定義されているいくつかのクラスがあります。彼らは以下のような関係を持っています:クライアント&製品は1対多にあり、クライアント&お問い合わせは1対多数あり、製品&お問い合わせは1対多数あります。私はここでコードファーストを使用しています。現在、流暢なAPIを使用して、関係を定義しています。これらの関係は必要なものとみなされます。クライアント& Product Relationshipをnullにすることはできません.ClientとInquiryもnullにすることはできません。

クライアントとの関係&お問い合わせは、コードファーストの付いたオプションのものでなければなりません。私がそれらを必要とするようにしようとすると、EFはデータベースを生成しません。

私のモデルで何が間違っていると教えてくれるのですか?EFがクライアントとの間に必要なリレーションシップを作成していない原因となっています& Inruiry?これはカスケード削除によるものですか?私はmssqlがClient、Product、Inquiryの間に1つのカスケード削除パスしか持つことができない場所をいくつか読んでいます。どんな助けの説明もいいでしょう。

+0

エラーが表示されますか? 「それは強制的にオプションのものになる」という意味はどうですか? – CDeutsch

+0

データベースが生成されないだけのエラーはありませんが、RetailerIDとManufacturerID nullをに、Fluent ApiをHasOptionalにすると、データベースが生成されます。 – user781310

+0

完全なマッピング設定を投稿してください。3つのエンティティに関連するすべてが議論されています。あなたの状況を再現するのに十分な情報を提供する。また、どのdbエンジンをターゲットにしていますか? –

答えて

2

EFコードファーストでは、デフォルトで生成された外部キー制約に対してカスケード削除の真を設定します。 NO

「サイクルまたは複数のカスケードパスを引き起こす可能性があり、テーブル 『お問い合わせ先』に関するFOREIGN KEY制約 『Inquiry_Retailer』を紹介DELETEを ON指定します。あなたが唯一のカスケードパスを持つことができるので、あなたは、このような例外何かを得ますACTIONまたはUPDATE ON NO ACTION、または変更他のFOREIGN KEY制約 あなたのモデルでは

あなたはクライアントからの問い合わせに3つのカスケードパスを持っている:。

クライアント --InquiryRetailers - >お問い合わせ
クライアント --InquiryManufacturers - >お問い合わせ
クライアント --Products - >製品 --Inquiries - >お問い合わせ

したがって2つのの関係(ご要望に応じて)を少なくともWillCascadeOnDelete(false)に設定する必要があります。

modelBuilder.Entity<Inquiry>().HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID).WillCascadeOnDelete(false); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID).WillCascadeOnDelete(false); 
+0

ありがとう、遅く返事を申し訳ありませんが、私は忙しかったです。他のブログを読んだ後、デフォルトのカスケード削除が問題だったと思いました。 – user781310