かなりのクラスがあるので、モデルの関連部分だけをここに入れようとします。うまくいけば、それは問題をキャプチャするだけで十分です: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.LocationID
とs.SolveID
の両方が0
に等しいです。
データコンテキストに追加して変更を保存すると、s.SolveID
は場所のID(この例では1609
)になります。それは非常に奇妙です。私は[Key]
属性をSolve
クラスのSolveID
と[ForeignKey("Location")]
〜LocationID
に追加しようとしましたが、違いはありませんでした。
Profile
をSolve
から削除するか、場所からList<Profile> Profiles
を削除するなど、さまざまなことを試しました。私は今正確に覚えていませんが、場所のIDの振る舞いに合わせてs.SolveID
を修正するためにいくつかの作業が行われました。
しかし、これらのプロパティはすべて理由のためにあります。可能であれば、これらのプロパティを削除する必要はありません。なぜこれが起こっているのか、それを正しく修正する方法はわかりません。私は助けていただきありがとうございます。
私はあなたがすでにtried-データannotion(のようなエーテル、外部キーを再度追加する必要がありますだと思うと、私は思いました解決策)や、流暢なAPIを使用して追加することができます。これはそれを修正するかもしれません:http://stackoverflow.com/questions/21229373/ef-foreign-key-using-fluent-api –