【发布时间】:2017-09-15 23:01:03
【问题描述】:
上下文是每个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);
}
}
}
问题是当car2 使用相同的CarBrand honda 添加到数据库时,我得到'UNIQUE constraint failed: CarBrands.CarBrandId' 异常。
我希望它在第二个事务的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...
}
【问题讨论】:
-
不确定这是否是导致问题的原因,但我通常在 CRUD 操作中看不到静态。
-
为什么每次都必须使用不同的上下文?
-
假设我重新启动了应用程序。那么这将是在不同的情况下,对吧?
标签: c# sql entity-framework sqlite entity-framework-core