2017-06-05 10 views
0

私は次のコードの最初のモデルを持っています。 1人のユーザーが複数の製品を持つことができるため、ユーザーと製品の間に1対多の関係があります。指定されたスキーマは無効です。エラー:タイプ 'User'が利用できないため、 'Product_CreatedByUser'という関係はロードされませんでした。

Schema specified is not valid. Errors: The relationship 'Models.Product_CreatedByUser' was not loaded because the type 'User' is not available. 

私は最初にコードを使用していますが、これで助けてもらえますか?

ユーザー:

public class User 
{ 
    public long UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

製品: - ModifiedBy通じCreatedByと1から1

public class Product 
    { 
    public long ProductId { get; set; } 
    public string ProductCode { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public long CreatedBy { get; set; } 
    public long ModifiedBy { get; set; } 
    public DateTime ModifiedDate { get; set; } 
    public bool IsDeleted { get; set; } 
    [ForeignKey("CreatedBy")] 
    public virtual User CreatedByUser { get; set; } 
    [ForeignKey("ModifiedBy")] 
    public virtual User ModifiedByUser { get; set; } 
} 
+0

:あなたがオンに流暢なコンフィギュレーション・とにかくを必要とするので、カスケードは、あなたがより良いForeignKeyInverseProperty注釈を削除し、流暢に全体を構成するだろう、一方または両方の関係のためにオフに削除します'User.Products'ナビゲーションプロパティで表されるはずの' User'と 'Product'が作成または変更されていますか? –

+0

@IvanStoevユーザーが製品を追加または更新できるので、両方ともにする必要があります。 – Nirmal

+0

問題は、残念ながらそれは*できません* - EFは、各リレーションシップに対して個別のナビゲーションプロパティを必要とします。したがって、 'User.CreatedProducts'や' User.ModifiedProducts'のような2つのプロパティを作成し、適切にマップするか、 'InverseProperty'属性や流暢な設定を使って' User.Products'をFKの1つにマッピングします。 –

答えて

2

はモデルによれば、ProductUserに2多対一のFK関係を持っています。ただし、Userクラスには単一のProductsコレクションが含まれていますが、EFでは各リレーションシップに対して1つまたは0の対応するナビゲーションプロパティが必要です。また、現在のFKのどれがそのコレクションをマップすることになっているのかわからないので、静かに3番目の関係を作成しようとします:(デフォルトのマッピングはこのようなシナリオでは機能しないので、InversePropertyまたはFluent 。APIが正しくマッピングを指定する

例えば、双方向のマッピングは次のように指定することができます。

public class User 
{ 
    public long UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    [InverseProperty("CreatedByUser")] 
    public virtual ICollection<Product> CreatedProducts { get; set; } 
    [InverseProperty("ModifiedByUser")] 
    public virtual ICollection<Product> ModifiedProducts { get; set; } 
} 

Upate:は、上記の修正マッピングの問題が、それは複数として知られている別の問題を紹介しますカスケードパス、デフォルトのEF規則では、カスケード削除が1対多のr歓喜。あなたが間に2 1対多の関係を持って

modelBuilder.Entity<Product>() 
    .HasRequired(e => e.CreatedByUser) 
    .WithMany(e => e.CreatedProducts) 
    .HasForeignKey(e => e.CreatedBy) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Product>() 
    .HasRequired(e => e.ModifiedByUser) 
    .WithMany(e => e.ModifiedProducts) 
    .HasForeignKey(e => e.ModifiedBy) 
    .WillCascadeOnDelete(false); 
関連する問題