Thursday, August 29, 2013

EF Code First AddOrUpdate puts null into referenced objects

I've ran into issue in my Seed() function, where I generate stub data.
This is my design:

    public class AircraftModel
    {
        public Guid Id { get; set; }

        public string Name { get; set; }

        public Guid ManufacturerId { get; set; }
        public virtual Manufacturer Manufacturer { get; set; }
    }

Now, I tried following code to generate data:

context.AircraftModels.AddOrUpdate(m => m.Name
  , new AircraftModel { 
        Name = "Global Express XRS", 
        Manufacturer = context.Manufacturers.Single(c => c.Name == "Bombardier Inc.") 
    }
);

It should work like charm I though, but it didn't. The problem was, that the Manufacturer was set to null after running AddOrUpdate - I guess because the ManufacturerId didn't match Manufacturer object.
When I changed to code to this, it worked fine:

context.AircraftModels.AddOrUpdate(m => m.Name
  , new AircraftModel { 
        Name = "Global Express XRS", 
        ManufacturerId = context.Manufacturers.Single(c => c.Name == "Bombardier Inc.").Id 
    }
);
Ok, so there's obvious problem with syncing the Manufacturer object and the ManufacturerId.
I've decided to keep them in sync using following modification:

    public class AircraftModel
    {
        private Manufacturer _manufacturer;

        public Guid Id { get; set; }

        public string Name { get; set; }

        public Guid ManufacturerId { get; set; }
        public virtual Manufacturer Manufacturer
        {
            get { return _manufacturer; }
            set
            {
                if (value != null && value.Id != ManufacturerId)
                    ManufacturerId = value.Id;
                _manufacturer = value;
            }
        }

    }

Now this code works as expected. Not sure if it's a bug or "feature"?...

No comments: