2016-10-10 7 views
1

私はEntity Frameworkを初めて使用しています。私たちはまずEF6モデルを使用したアーキテクチャでアプリケーションを追加します。 私はそのようなクラス(私は良く説明するためにコードを単純化しています)があります。私たちはそのような物体領域を初期化するアプリケーションでのビジネス層にEF 6オブジェクトを2回挿入しようとしました

class Country 
{ 
int CountryId (identity column) { get; set; } 
string Name { get; set; } 
ICollection<Child> Regions { get; set; } 
} 

class Region 
{ 
int RegionId (identity column) { get; set; } 
string Name { get; set; } 
int CountryId { get ; set; } //foreign key to Country(CountryId) 
} 

を:

public Region Create() 
{ 
Provincia Region = new Region(); 
provincia.Country = CountryDAL.GetByCode("ES"); 
provincia.CountryId = Region.Country.CountryId ; 

return Region ; 
} 

CountryDALですDBから国を読み込むレイヤーです。 私はsaveChangesをしようとすると、私はDB beacauseからユニークな規制例外を持っています.EFは国を2回挿入しようとします。私は、私は新しいオブジェクトとして国を保存したいいけない、CountryIdが満たされた彼の財産を持つエンティティリージョンを保存したい理由

this.context.Entry(entity).State = Data.Entity.EntityState.Added; 
entity.AcceptChanges(user); 
int Result = this.context.SaveChanges(); 

私は理解できません。 しかし、他のビューでは、国を作成し、その国を子として保存することができます(これは私が解決した別の問題です)。

ありがとうたくさん

+0

保存したい場合は、コンテキストに追加する必要がありますか?あなたはそれを(それが添付されている場合)保存することができますまたはそれを追跡していないコンテキストに添付する? – Deniz

+0

ありがとうございました。私はそれを理解していません。あなたはそれを説明できますか? 「this.context.Entry(Entity).State = Data.Entity.EntityState.Added;」という行を参照してください。 – Jsanchez

+0

はい。私はEFの専門家ではありませんが、エンティティを保存したい場合は、エンティティを添付するか(存在しない場合)、または直接SaveChanges()を呼び出す必要があります。 'Add()'はDBのINSERTによく似ています。あなたのDBではeaxistだが、あなたの文脈ではないなら、 'Add()'を呼んでもあなたの文脈に害はないが、既存の項目をデータベースに挿入するのはエラーである。私は 'Add()'と 'Data.Entity.EntityState.Added:'を使っています。 – Deniz

答えて

0

まず、あなたのコードはコンパイルされないと思います。 Create()メソッドにエラーがあります。 Region型があり、変数の名前として使用します。

第2に、作成メソッドでナビゲーションプロパティ(Country)と外部キー値(CountryId)の両方を取得します。 CountryIdプロパティを割り当てることができます。だから私の意見では、これは動作するはずです:

public Region Create() 
{ 
    var country = CountryDAL.GetByCode("ES"); 
    Region provincia = new Region(); 
    provincia.CountryId = country.CountryId; 

    return Region; 
} 

また、すべての国のエンティティを読み込まないことをお勧めします。代わりに、 "ES"文字列に基づいて国のidだけを返すクエリを作成します。

関連する問題