奇怪的 Entity Framework 行为

Strange Entity Framework behavior

我有 2 个模型:

public class Office
{
    [Key] public int OfficeId { get; set; }
    public string Brand { get; set; }
    public string Type { get; set; }
    [NotMapped] public IRepository<CarItem> CarsDataBase { get; set; }
    public virtual ICollection<CarItem> Cars { get; set; }
    public Office(string brand, string type)
    {
        Type = type;
        Cars = new List<CarItem>();
        Brand = brand;
    }
}

public class CarItem
{
    public CarItem() { } //for serialization
    public CarItem(string brand, string model, uint price, uint stockBalance)
    {
        Brand = brand;
        Model = model;
        Price = price;
        StockBalance = stockBalance;
    }
    [Key] public int ItemId { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    public uint Price { get; set; }
    public uint StockBalance { get; set; }
    public int? OfficeId { get; set; }
    public Office Office { get; set; }
}

和数据库上下文

public class EFDataBaseContext : DbContext
{
    public DbSet<Office> Offices => Set<Office>();
    public DbSet<CarItem> CarItems => Set<CarItem>();
    public EFDataBaseContext()
    {
        Database.EnsureCreated();
    } 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=(localdb)\mssqllocaldb;Database=carstoredb;Trusted_Connection=True;");
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Office>().HasData
        (
            new Office("Audi", "SQL")
            {
                OfficeId = 1,
            },
            new Office("Scoda", "SQL")
            {
                OfficeId = 2,
            }
        );
        modelBuilder.Entity<CarItem>(entity =>
        {
            entity.HasOne(item => item.Office).WithMany(office => office.Cars).HasForeignKey(item => item.OfficeId).OnDelete(DeleteBehavior.Cascade);
        });
        modelBuilder.Entity<SparePart>(entity =>
        {
            entity.HasOne(item => item.Office).WithMany(office => office.Parts).HasForeignKey(item => item.OfficeId).OnDelete(DeleteBehavior.Cascade);
        });
        modelBuilder.Entity<CarItem>().HasData
        (
            new CarItem { OfficeId = 1, ItemId = 1, Brand = "Audi", Model = "A228", Price = 4, StockBalance = 14 },
            new CarItem { OfficeId = 1, ItemId = 2, Brand = "Audi", Model = "Super", Price = 44, StockBalance = 5 },
            new CarItem { OfficeId = 2, ItemId = 3, Brand = "Scoda", Model = "Logan", Price = 47, StockBalance = 9 },
            new CarItem { OfficeId = 2, ItemId = 4, Brand = "Scoda", Model = "Spider", Price = 78, StockBalance = 3 }
        );
    }

我手动添加了一个名为 BSU 的办公室。 在主要功能中,我这样写:

using (EFDataBaseContext db = new EFDataBaseContext())
{
    Office office = mainOffice.Dealerships.FirstOrDefault(of => of.Brand == "BSU");
    CarItem carItem = new CarItem(office.Brand, "BSss", 2222, 4);
    office.CarsDataBase ??= new EFDataBase(office);
    office.CarsDataBase.Create(carItem);
}

每次将新的 CarItem 添加到 BSU 时,将新的 CarItem 添加到 BSU 都会神奇地在我的数据库中创建一个名为 BSU 的新办公室。

using (EFDataBaseContext db = new EFDataBaseContext())
{
    Office office = mainOffice.Dealerships.FirstOrDefault(of => of.Brand == "Audi");
    CarItem carItem = new CarItem(office.Brand, "AuuuU", 2222, 4);
    office.CarsDataBase ??= new EFDataBase(office);
    office.CarsDataBase.Create(carItem);
}

另一方面,向奥迪添加新的 CarItem 完全没有任何作用。数据库中没有出现奥迪品牌的新车,什么也没有。

看来你把事情复杂化了

将新车添加到现有办公室应该如下所示:

var ctx = new EFDatabaseContext();
var off = ctx.Offices.FirstOrDefault(o => o.Type == "Main" and o.Brand == "Audi");
off.Cars.Add(new CarItem(off.Brand, "AuuuU", 2222, 4));
ctx.SaveChanges();

找到办公室,添加汽车,保存更改