Home > Software engineering >  Strange Entity Framework behavior
Strange Entity Framework behavior

Time:01-27

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.

CodePudding user response:

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

  •  Tags:  
  • Related