既存の DB から生成された EntityFramework モデルを使用して、Silverlight MVVM (SimpleMVVM ツールキット) Ria サービス アプリを作成しました。最初に、親をロードする親エンティティのリストを表示する Page の ViewModel で、親を選択した後、さらに編集ページに移動して、子エンティティの管理を行います。その前に、親EntityをpageDataHelper - key value pair DictionaryでEdition PageのViewModelに渡し、データベースから更新します。次に、エンティティの主キーで読み込むことができます。これは ListBox の子です。これで、チャイルドのCRUDができるようになりました。残念ながら、そのうちの1つを更新したいときに、次のようになりました。
UPDATE ステートメントが FOREIGN KEY 制約 "FK_Pozycje_Kosztorysy" と競合しました。データベース "D:...\APP_DATA\EMS.MDF"、テーブル "dbo.Kosztorysy"、列 'KosID' で競合が発生しました。
Aplication は DB で更新を行いますが、entityframework は常に例外をスローします。これを処理します... db の両方のテーブルが On Update/Delete Cascade に設定されています。エンティティの外観:
internal sealed class KosztorysMetadata
{
public int KosID { get; set; }//Primary Key
public EntityCollection<Pozycja> Pozycje { get; set; } //Childs
}
}
internal sealed class PozycjaMetadata
{
public int KosID { get; set; }// Foreign Key
public int PozID { get; set; }//Primary Key
}
}
App.Web では、エンティティを取得する関数:
public IQueryable<Kosztorys> GetKosztorysByID(int id)
{
var query = from k in this.ObjectContext.Kosztorysy
where k.KosID==id
select k;
return query;
}
public IQueryable<Pozycja> GetPozycjeGlowne(Int32 id)
{
var query = from k in this.ObjectContext.Pozycje
where k.KosID == id && (k.NadPozID == null || k.TypRMS == 0 || k.TypRMS == TypRMSBVals.Dzial)
select k;
return query;
}
ViewModel で。
class KosztorysViewModel{
public Kosztorys WybranyKosztorys
{
get { return wybranyKosztorys; }
set{ WybranyKosztorys = value;}}
private ObservableCollection<Kosztorys> kosztorysy;
public ObservableCollection<Kosztorys> Kosztorysy{}}
public void OdsiwezKosztorys()//Refresh parent
{ this.serviceAgent.PobKosztorys(WybranyKosztorys.KosID, (encje, ex) => { kosztorysOdswiezony(encje, blad); });
}
void kosztorysOdswiezony(List<Kosztorys> encje, Exception exc) //Refreshed Parent
{ Kosztorysy = new ObservableCollection<Kosztorys>(encje);
WybranyKosztorys = Kosztorysy[0];}
public void PobDzialy()
{
if (WybranyKosztorys != null)
{
this.serviceAgent.PobGlownePozycje(WybranyKosztorys.KosID, (encje, ex) => dzialyPobrane(encje, ex));
}
}
void dzialyPobrane(List<Pozycja> encje, Exception exc) //callback
{
Dzialy.Clear();
Dzialy = new ObservableCollection<Pozycja>(encje);
}}
どうしたの?私は;EF4.3、Silverlight 5、MS SQL Server 2008R を使用しています