1

かなりのクラスがあるので、モデルの関連部分だけをここに入れようとします。うまくいけば、それは問題をキャプチャするだけで十分です:EF6コードまず、複数のカスケードパスと変なFKの振る舞い

public class Solve 
{ 
    public int SolveID { get; set; } 

    public int LocationID { get; set; } 
    public virtual Location Location { get; set; } 

    public int ProfileID { get; set; } 
    public virtual Profile Profile { get; set; } 

    public int BillID { get; set; } 
    public virtual Bill Bill { get; set; } 

    public int? PanelID { get; set; } 
    public virtual Panel Panel { get; set; } 
} 

public class Location 
{ 
    public int LocationID { get; set; } 

    [Index] 
    [StringLength(48)] 
    public string Name { get; set; } 

    [Index] 
    public State State { get; set; } 

    public double Latitude { get; set; } 
    public double Longitude { get; set; } 

    public virtual List<Profile> Profiles { get; set; } 
} 

public class Profile 
{ 
    public int ProfileID { get; set; } 

    public int LocationID { get; set; } 
    public virtual Location Location { get; set; } 

    public double Capacity { get; set; } 

    public virtual List<ProfileSample> ProfileSamples { get; set; } 
} 

public class ProfileSample 
{ 
    [Key, ForeignKey("Profile")] 
    [Column(Order = 1)] 
    public int ProfileID { get; set; } 
    public virtual Profile Profile { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    [DataType(DataType.Date)] 
    public DateTime Date { get; set; } 

    [Key] 
    [Column(Order = 3)] 
    public TimeSpan TimeOfDay { get; set; } 

    public double SampleValue { get; set; } 
} 

私はそれが「複数のカスケードパス」に文句を開始、その時点でSolveクラスを導入するまで、だから、それはすべての作業罰金でした。私は、コンテキストに以下を追加し、上で、その後からOKと思われた:

using (Model.BlueData bd = new Model.BlueData()) 
{ 
    Random rng = new Random(); 

    s = new Model.Solve() 
    { 
     Location = bd.Locations.Find(rng.Next(0, bd.Locations.Count())), 
     Bill  = bd.Bills.Find(rng.Next(0, bd.Bills.Count())), 
     Profile = bd.Profiles.Find(rng.Next(0, bd.Profiles.Count())) 
    }; 

    bd.Solves.Add(s); 
    bd.SaveChanges(); 

    s = bd.Solves 
     .Where(u => u.SolveID == s.SolveID) 
     .Include(u => u.Location) 
     .Include(u => u.Profile) 
     .Include(u => u.Profile.ProfileSamples) 
     .Include(u => u.Bill) 
     .FirstOrDefault(); 
} 

は、したがって、上記のコードでは、単にランダムSolveオブジェクトを生成します。それは、正しく動作しなかったこと以外は

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Solve>() 
     .HasRequired(s => s.Location) 
     .WithRequiredDependent() 
     .WillCascadeOnDelete(false); 
} 

それをデータコンテキストに追加してから、関連付けられたすべてのデータとともに再度取得します。確かにこれを行うためのよりエレガントな方法がありますが、今は私のアプリの他の部分が動作していることを確認するコードをテストするだけです。

予想通り、私はSolve sオブジェクトを作成するときに、s.Locationは、たとえば、IDと、特定の位置で1609、もちろんs.LocationIDs.SolveIDの両方が0に等しいです。

データコンテキストに追加して変更を保存すると、s.SolveIDは場所のID(この例では1609)になります。それは非常に奇妙です。私は[Key]属性をSolveクラスのSolveID[ForeignKey("Location")]LocationIDに追加しようとしましたが、違いはありませんでした。

ProfileSolveから削除するか、場所からList<Profile> Profilesを削除するなど、さまざまなことを試しました。私は今正確に覚えていませんが、場所のIDの振る舞いに合わせてs.SolveIDを修正するためにいくつかの作業が行われました。

しかし、これらのプロパティはすべて理由のためにあります。可能であれば、これらのプロパティを削除する必要はありません。なぜこれが起こっているのか、それを正しく修正する方法はわかりません。私は助けていただきありがとうございます。

+0

私はあなたがすでにtried-データannotion(のようなエーテル、外部キーを再度追加する必要がありますだと思うと、私は思いました解決策)や、流暢なAPIを使用して追加することができます。これはそれを修正するかもしれません:http://stackoverflow.com/questions/21229373/ef-foreign-key-using-fluent-api –

答えて

2

はまずLocationSolveオブジェクトで参照されているので、位置が主であり、解決する、私は、このマッピングが間違っている場合に依存思われる -

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Solve>() 
     .HasRequired(s => s.Location) 
     .WithRequiredDependent() 
     .WillCascadeOnDelete(false); 
} 

は、それがあるべきである -

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Solve>() 
     .HasRequired(s => s.Location) 
     .WillCascadeOnDelete(false); 
} 

第2に、外部キーを参照するSolveが定義されているため、定義は次のようにする必要があります。 -

public class Solve 
{ 
    public int SolveID { get; set; } 

    [ForeignKey("Location")] 
    public int LocationID { get; set; } 
    public virtual Location Location { get; set; } 

    [ForeignKey("Profile")] 
    public int ProfileID { get; set; } 
    public virtual Profile Profile { get; set; } 

    [ForeignKey("Bill")] 
    public int BillID { get; set; } 
    public virtual Bill Bill { get; set; } 

    [ForeignKey("Panel")] 
    public int? PanelID { get; set; } 
    public virtual Panel Panel { get; set; } 
} 

第3に、オブジェクトを保存するときは、最初に1)プリンシパルを保存する必要があります。それ以外の場合は、新しいエントリを作成しようとします.2)手動で添付する必要があります。私が見つけた最も簡単なのは、(1)です。主な目的を保存した後、私は外部キーとEFだけを割り当てます。

using (Model.BlueData bd = new Model.BlueData()) 
{ 
    Random rng = new Random(); 

    s = new Model.Solve() 
    { 
     LocationID = bd.Locations.Find(rng.Next(0, bd.Locations.Count())).LocationID, 
     BillID  = bd.Bills.Find(rng.Next(0, bd.Bills.Count())).BillID, 
     ProfileID = bd.Profiles.Find(rng.Next(0, bd.Profiles.Count())).ProfileID 
    }; 
    s.Bill = s.Location = s.Profile = null; //otherwise EF tries to create them 
    bd.Solves.Add(s); 
    bd.SaveChanges(); 

    s = bd.Solves 
     .Where(u => u.SolveID == s.SolveID) 
     .Include(u => u.Location) 
     .Include(u => u.Profile) 
     .Include(u => u.Profile.ProfileSamples) 
     .Include(u => u.Bill) 
     .FirstOrDefault(); 
} 

EDIT 1:すべき場所クラス -

public class Location 
{ 
    [Key] //mark location ID as primary key 
    public int LocationID { get; set; } 

    [Index] 
    [StringLength(48)] 
    public string Name { get; set; } 

    [Index] 
    public State State { get; set; } 

    public double Latitude { get; set; } 
    public double Longitude { get; set; } 

    public virtual List<Profile> Profiles { get; set; } 
} 
+0

ありがとう、あなたの答えをありがとう。この行: 's.Bill = s.Location = s.Profile = null;'、それは必要ですか?そうでなければ、EFはそれらを作成しようとしますが、すでに「ヌル」になっているでしょうか? – Ozzah

+0

ええ、これはちょうど彼らがnullであることを確認するためです。あなたはどこにでも同じコードを書くつもりはありません。あなたの問題を解決した場合は、答えとして受け入れてください。同じ問題を抱えている他の人が、これが解決策になるかもしれないことをご存じですか。 –

+0

あなたが推奨する変更を実装しましたが、エラーが発生しました:Solve_Location_Source :: Multiplicityは、 'Solve_Location'という関係の 'Solve_Location_Source'ロールでは無効です。依存ロールのプロパティはキープロパティではないため、依存ロールの多重度の上限は「*」でなければなりません。 – Ozzah

関連する問題