私たちは、私が私のテーブルを生成し、次のクラスを持っていると仮定しましょう:私のDbContextクラスでEF6
public class Car
{
public Guid Id { get; set; }
public Guid OwnerId { get; set; }
public string Color { get; set; }
public virtual Owner Owner { get; set; }
}
public class Owner
{
public Guid Id { get; set; }
public string Name { get; set; }
public ICollection<Car> Cars { get; set; }
}
私は車を除去するための方法を作成しています。私は、次の2つのアプローチの違いが何であるかを知っているように、それが重要ならば、私が使用して接近するでしょう:
アプローチ1:
public class CarDbContext : DbContext
{
public DbSet<Car> Car { get; set; }
public DbSet<Ownerr> Owner { get; set; }
public CarDbContext(string cs) : base (cs) {}
public void RemoveCar(Car car)
{
Car.Attach(car);
Car.Remove(car);
SaveChanges();
}
}
アプローチ2:
public class CarDbContext : DbContext
{
public DbSet<Car> Car { get; set; }
public DbSet<Ownerr> Owner { get; set; }
public CarDbContext(string cs) : base (cs) {}
public void RemoveCar(Car car)
{
Entry(car).State = EntityState.Deleted;
SaveChanges();
}
}
何場合をI車は依存しているので、所有者を今すぐ削除したい、私は今問題を使用するアプローチですか?
明らかに、私が 'Owner.Remove(owner)'を呼び出すと、その所有者に依存するCarテーブルのレコードがあるため、コードがクラッシュします。 'Entry(owner).State = EntityState.Deleted;を呼び出すと、所有者が削除され、所有者がいない車のテーブルに孤立したレコードが残ってしまいます。これは正しいです?私はこれを、あなたが証明したリンクで読んだところに基づいています。 – Bojan
これは、データベースキーの設定方法とエンティティの設定方法によって異なります。 Remove()は子エンティティを削除するか、外部キーをnullにすることで子エンティティを処理する必要があるため例外がスローされる可能性は低いEntityState.Deletedによってデータベースに例外がスローされます –
最良の選択肢は、あなたのコンテキストがSQLのローカルインスタンスを指し示していることを確認し、それぞれのアプローチを試して動作を検証してください –