2017-09-05 4 views
0

私は、このクラス(簡体字)があります。エンティティframwork - 同じテーブルへのREFプロパティを保存

public class Customer 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 

     [InverseProperty("Customers")] 
     public virtual Customer ParentCustomer { get; set; } 

     [InverseProperty("ParentCustomer")] 
     public virtual ICollection<Customer> Customers { get; set; } 
    } 

をしかし、私はそれが動作していない「ParentCustomer」を更新しようとすると、私はこのようにそれを更新しよう:

var currCostumer = context.Customers.First(a => a.ID == key); 
currCostumer.ParentCustomer = context.Customers.First(a => a.ID == 12); 
await context.SaveChangesAsync(); 

私はトランザクション内でもなくても試してみました。私は生成されたSQLでは、このParentCustomer(ParentCustomerID)フィールドを除くすべてのフィールドを更新することがわかります。次のような "currCustomer"を取得しようとすると、正しいカスタマーを参照していることがわかります。しかし、私は新しいwebapiの要求でそれを試してみてください。

var currCostumer = context.Customers.First(a => a.ID == key); 
// currCostumer.ParentCustomer is correct here (if same request) 

これは、モデルビルダーである:ここで

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
builder.EntitySet<Customer>("Customer"); 
+0

ここで、PreferredResellerですか?正しいモデルを記述してください – Vecchiasignora

+0

Entity Frameworkによって生成されたか、手動で生成されたクラスですか?エンティティは適切に設定された関係を持っていますか? – Andrew

+0

申し訳ありませんが、 "PreferredReseller"はParentCustomerである必要があります。 – Robert

答えて

0

は、このような自己参照の親のために働く必要がありModelBuilderの構成です - 子関係。私はまた、モデルに外部キーを公開するのが好きです。

public class Customer { 
    public virtual Customer ParentCustomer { get; set; } 
    public virtual ICollection<Customer> Customers { get; set; } 

    /// <summary> 
    /// Exposed foreign key of the <see cref="ParentCustomer "/>. 
    /// This is optional (might be null), because not every Customer is grouped into another Customer . 
    /// </summary> 
    public long? ParentCustomerId { get; set; } 
} 

ModelBuilder.Entity<Customer>() 
    .HasMany(x => x.Customers) 
    .WithOptional(x => x.ParentCustomer) // Not all Customers are contained in a parent Customer, therefore this relationship is optional 
    .HasForeignKey(x => x.ParentCustomerId) 
    .WillCascadeOnDelete(false);   // ON DELETE NO ACTION constraint is necessary or we would introduce multiple cascade paths 

我々はカスケードこの場合には、削除を使用することはできませんので、あなたが、手動で正しい削除の動作を実装する必要があります注意してください。

+0

これは、OP提供モデル(ナビゲーションプロパティのみ、流暢な設定なし、シャドウFK名は 'ParentCustomer_Id')との規約によるデフォルトの関係マッピングです。 –

+0

Fluent APIを使ってすべてのリレーションシップを設定しているので、 '[InverseProperty]'の正確な動作は分かりません。上記の設定は本番環境で動作します。 –

+0

私は現在、モデルビルダの関係をマップしていません。このセットアップの要件ですか? – Robert

関連する問題