2012-03-06 15 views
0

私は以下の問題があります:同じクラス/テーブルへの2つの参照を取得できません

私はデータベースでコードを生成するために最初に使用する2つのクラスを持っています。

public class Chart 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public State Initial { get; set; } 
    public virtual ICollection<State> States { get; set; } 
} 

public class State 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

私はまた、チャートクラスの初期特性は、それが初期状態だを指すようにしたいです。

でも、私は何をしようとしても動作しません。

"従属操作の有効な順序を判断できません。依存関係は、外部キーの制約、モデルの要件、またはストアード・プロシージャーによって存在する可能性があります。生成された値。

これをもっともっとinteresstingするには、初期状態をチャートクラスの状態の1つにしたいと思います。

誰かお手伝いできますか?

UPDATE:

Iは、パズルのピースが見つかりました:

コード最初のフレームワークは、2つのテーブルを作成しよう。
チャート:列を持つ - > ID、Initial_Id
国:列を持つ - > ID、名前、Chart_Id

状態テーブルとチャートテーブルにState.Chart_Id参照にChart.Initial_Id参照。さて、これは削除をカスケード接続する際に、円形の問題を紹介したりなどを挿入...

うーん...

+0

私は以下の解決策を発見しました。その後、私はグラフを保存し、初期状態を設定して、再度保存します。それは醜いです、私は知っていますが、このように私は仕事を終わらせます。レイヤーはこの醜さを隠します。 ;-) – Tim

答えて

0

これは、暗闇の中でだけでショットですが、それは事実とは何かを持っていると思いますか両方のクラスのプロパティ(おそらく、あなたのプライマリキーにしたいもの)はidというGUIDを持っていますか? StateIdとChartIdに名前を変更するのはどうですか?何もない場合は、私が...これはちょうど良く命名練習だと思う

完全な開示:私はCF EFを使用していないが、ちょうど現在

+0

ありがとうございました。私はそれが問題ではないと思います。 idプロパティは2つの異なるテーブルのカラム名になります。 idプロパティは2つの異なるクラスの単なるプロパティであるため、名前の練習が悪いと思います。プロパティ名の前にクラス名を置くことは、それがその特定のクラスのプロパティであるため、値を追加しません。 'name'プロパティをStateNameに変更するだけでは、値は追加されません。それは単に冗長です。 – Tim

+0

おそらく、これらがテーブルに直接変換されている場合、自動生成クエリ以外のコンテキストで参照している可能性があるテーブルは、IDの冗長な意味を見るのが本当に好きです。 (例:そうso.SomeObjectId = soo.SomeOtherObjectId ON SomeOtherObject洙を登録しようSomeObjectのFROM SomeObjectId を選択) 申し訳ありませんが、私の考えはいえ、手で問題を助けていませんでした。) – Killnine

+0

私はあなたが行っている場所を確認します。しかし、私はそれが問題を解決するために各列のテーブル名の前に付けることが可能だと思います。右? – Tim

0

EF興味深い記事としてこれを越えないことができつまずいこのマッピングは、循環依存性と、更新/挿入の順序を決定できないデータベース生成キーの組み合わせで終わるため、記述したとおりに正確に実行します。

しかし、私は、州のエンティティが複数のチャートエンティティ間で共有されることが想定されることを前提にしています。言い換えれば、複数のチャートが同じ状態を参照することができます。この場合は、何が本当に持っていることはチャートと国家間の多対多の関係があり、あなたは無効にすることができますOnModelCreatingコンテキストはEFこれを伝えるために:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Chart>() 
     .HasMany(s => s.States) 
     .WithMany(); 
} 

は今、このような何かが動作します:

using (var context = new ChartContext()) 
{ 
    var state1 = new State { Name = "State1" }; 
    var state2 = new State { Name = "State2" }; 

    var chart = 
     new Chart 
     { 
      Initial = state1, 
      States = new List<State> { state1, state2 } 
     }; 

    context.Charts.Add(chart); 
    context.SaveChanges(); 
} 

ご覧のとおり、チャートは初期状態と一連の状態を持ち、初期状態は状態の集合の1つです。

実際に各状態が1つの唯一のチャートエンティティに関連付けられている場合は、何か他のものを把握する必要があります。おそらく上記の解決策を提示するための回避策がありますが、 。

関連する問題