บริบทคือ Car
แต่ละอันมี CarBrand
ที่สอดคล้องกัน ตอนนี้ชั้นเรียนของฉันมีดังต่อไปนี้:
public class Car
{
public int CarId { get; set; }
public int CarBrandId { get; set; }
public CarBrand CarBrand { get; set; }
}
public class CarBrand
{
public int CarBrandId { get; set; }
public string Name { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Car> Cars { get; set; }
public DbSet<CarBrand> CarBrands { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(@"Data Source = MyDatabase.sqlite");
}
}
นี่คือตัวอย่างการดำเนินการโค้ดของฉัน...
class Program
{
static void Main(string[] args)
{
AlwaysCreateNewDatabase();
//1st transaction
using (var context = new MyContext())
{
var honda = new CarBrand() { Name = "Honda" };
var car1 = new Car() { CarBrand = honda };
context.Cars.Add(car1);
context.SaveChanges();
}
//2nd transaction
using (var context = new MyContext())
{
var honda = GetCarBrand(1);
var car2 = new Car() { CarBrand = honda };
context.Cars.Add(car2);
context.SaveChanges(); // exception happens here...
}
}
static void AlwaysCreateNewDatabase()
{
using (var context = new MyContext())
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
}
}
static CarBrand GetCarBrand(int Id)
{
using (var context = new MyContext())
{
return context.CarBrands.Find(Id);
}
}
}
ปัญหาคือฉันได้รับข้อยกเว้น 'UNIQUE constraint failed: CarBrands.CarBrandId' เมื่อ car2
ถูกเพิ่มลงในฐานข้อมูลด้วย CarBrand
honda
เดียวกัน
สิ่งที่ฉันคาดหวังว่าจะทำคือระหว่างธุรกรรมที่ 2 ของ context.SaveChanges()
มันจะเพิ่ม car2
และตั้งค่าความสัมพันธ์กับ CarBrand
อย่างเหมาะสม แต่ฉันได้รับข้อยกเว้นแทน
แก้ไข: ฉันต้องการรับอินสแตนซ์ CarBrand ของฉันในบริบท/ธุรกรรมอื่นจริงๆ
//really need to get CarBrand instance from different context/transaction
CarBrand hondaDb = null;
using (var context = new MyContext())
{
hondaDb = context.CarBrands.First(x => x.Name == "Honda");
}
//2nd transaction
using (var context = new MyContext())
{
var car2 = new Car() { CarBrand = hondaDb };
context.Cars.Add(car2);
context.SaveChanges(); // exception happens here...
}