简体   繁体   中英

Strange Entity Framework behavior

I have 2 models:

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;
    }
}

and

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; }
}

and DataBase Context

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 }
        );
    }

Manually I added an office called BSU. And in main function I write this:

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);
}

Adding a new CarItem to the BSU somehow magically creates a new office named BSU in my database every time a new CarItem is added to the 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);
}

Adding a new CarItem to an Audi, on the other hand, does absolutely nothing. No new cars with the Audi brand appear in the database, and nothing at all.

Seems like you're over complicating things

Adding a new Car to an existing Office should perhaps looks like:

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();

Find the office, add a car, save the changes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM