正規化のためにいくつかのモデルを分離しましたが、それらはすべて 1 対 1 の関係を持つ必要があります。EF で 1 対 1 の関係を作成するのは難しいため、次のことを行いました。
public class Fleet : SpaceObject
{
public int Id{ get; set; }
public int? ActiveCaptainId { get; set; }
public int? ResourcesId { get; set; }
[ForeignKey("ActiveCaptainId")]
[Display(Name = "Captain in Command")]
public virtual Captain ActiveCaptain { get; set; }
[ForeignKey("ResourcesId")]
public virtual Resources Resources { get; set; }
}
public class Captain
{
public int Id{ get; set; }
public int? FleetId { get; set; }
[ForeignKey("FleetId")]
public virtual Fleet Fleet { get; set; }
}
public class Resources
{
public int Id{ get; set; }
public int? FleetId { get; set; }
[ForeignKey("FleetId")]
public virtual Fleet Fleet { get; set; }
}
新しいユーザーが作成されたら、次のことを行います。
- 最初にキャプテンを作成します
- 変更内容を保存()
- 次に、フリートを作成し、船長をフリートに割り当てます
- 変更内容を保存()
- 次に、リソースを作成し、フリートをリソースに割り当てます
- 変更内容を保存()
- 次に、フリートをキャプテンに割り当て、リソースをフリートに割り当てます。
そのようです:
Captain newCapt = new Captain();
newCapt.Name = model.
newCapt.UserId = db.UserProfiles.FirstOrDefault(p=>p.UserName == model.UserName).UserId;
db.Captains.Add(newCapt);
db.SaveChanges();
//----Make a new Fleet
Fleet newFleet = new Fleet();
newFleet.ActiveCaptain = newCapt;
newFleet.UserId = db.UserProfiles.FirstOrDefault(p=>p.UserName == model.UserName).UserId;
db.Fleets.Add(newFleet);
db.SaveChanges(); //commit the changes to the database
Resources resources = new Resources();
resources.Fleet = newFleet;
db.Resources.Add(resources);
db.SaveChanges();
newFleet.Resources = resources;
newCapt.Fleet = newFleet;
db.Entry(newFleet).State = System.Data.EntityState.Modified;
db.Entry(newCapt).State = System.Data.EntityState.Modified;
db.SaveChanges();
これを行うためのより簡単な方法が必要だと感じています。新しいフリートが作成されると、新しいリソース エントリや船のエントリなどが作成されるようにする方法はありますか? これが不可能であることがわかる唯一の理由は、艦隊がデータベースに保存されるまで、艦隊からリソース/船長/船/などに主キーをリンクできないためです。