Есть проблема сохранения модели C # с Entity Framework - PullRequest
0 голосов
/ 02 февраля 2019

При сохранении модели возникла проблема.Вот мои родственные модели.

Марка:

public class Mark
    {
        public int Id { get; set; }
        [Display(Name = "Марка")]
        public string MarkName { get; set; }

        public virtual ICollection<CarModel> CarModels { get; set; }
        public virtual ICollection<Car> Cars { get; set; }

        public Mark()
        {
            CarModels = new List<CarModel>();
            Cars = new List<Car>();
        }
    }

CarModel:

public class CarModel
    {
        public int Id { get; set; }
        [Display(Name = "Модель")]
        public string ModelName { get; set; }

        public int MarkId { get; set; }
        public virtual Mark Mark { get; set; }

        public virtual ICollection<Equipment> Equipments { get; set; }
        public virtual ICollection<Car> Cars { get; set; }

        public CarModel()
        {
            Equipments = new List<Equipment>();
            Cars = new List<Car>();
        }
    }

Оборудование:

public class Equipment
    {
        public int Id { get; set; }
        [Required]
        public int Engine { get; set; }
        [Required]
        public int Power { get; set; }
        [Required]
        public int ReleaseYear { get; set; }
        [Required]
        public string DriveType { get; set; }
        [Required]
        public string Transmission { get; set; }
        [Required]
        public string Body { get; set; }
        [Required]
        public int MaxSpeed { get; set; }
        [Required]
        public int Weight { get; set; }
        [Required]
        public int MaxFuelVolume { get; set; }
        [Required]
        public string Color { get; set; }
        [Required]
        public string Picture { get; set; }

        public int CarModelId { get; set; }
        public virtual CarModel CarModel { get; set; }

        public virtual ICollection<Car> Cars { get; set; }

        public Equipment()
        {
            Cars = new List<Car>();
        }
    }

Автомобиль:

public class Car
    {
        public int Id { get; set; }
        [Required]
        public int Price { get; set; }
        [Required]
        public int Count { get; set; }

        public int? MarkId { get; set; }
        public virtual Mark Mark { get; set; }

        public int CarModelId { get; set; }
        public virtual CarModel CarModel { get; set; }

        public int? EquipmentId { get; set; }
        public virtual Equipment Equipment { get; set; }

        public virtual ICollection<Order> Orders { get; set; }

        public Car()
        {
            Orders = new List<Order>();
        }
    }

Итак, если я добавлю новую машину и в то же время новую марку, модель и комплектацию, хранилище будет хорошо, бренд создан, модель привязана к нему, модель в комплекте сМодель и ниже это сущность автомобиля со ссылками на все это.

Вот код для примера:

Context db = new Context();

Equipment equip = new Equipment() 
                      { Body = "Седан", Color = "Красный", DriveType = "Передний", Engine = 1600,
                        MaxFuelVolume = 60, MaxSpeed = 250, Picture = "Картинка", Power = 150,
                        ReleaseYear = 2015, Transmission = "Автомат", Weight = 2000 };
Mark mark = new Mark() { MarkName = "BMW" };
CarModel carModel = new CarModel() { ModelName = "M3" };

Car car = new Car();
car.Mark = mark;
car.CarModel = carModel;
car.Equipment = equip;

unitOfWOrk.Cars.Create(car);
unitOfWOrk.Save();

Но если я попытаюсь создать машину и ссылкусуществующая марка и существующая модель, но новая комплектация не удастся

Произошла ошибка при обновлении записей.Подробности смотрите во внутреннем исключении.

Вот пример кода:

Context db = new Context();
Equipment equip = new Equipment() { Body = "Седан", Color = "Красный", DriveType = "Передний", Engine = 1600,
                                    MaxFuelVolume = 60, MaxSpeed = 250, Picture = "Картинка", Power = 150,
                                    ReleaseYear = 2015, Transmission = "Автомат", Weight = 2000 };

Car car = new Car();
car.MarkId = 1;
car.CarModelId = 1;
car.Equipment = equip;

Насколько я понимаю, он ругается на public int CarModelId {get; set; } в модели Equipment, потому что я пыталсясделать int? и тогда этой ошибки нет.Поэтому вопрос заключается в том, почему при создании новых данных сущность угадывает, с чем ее связать, а в случае добавления новых данных этого не происходит

InnerException:

Система.Data.SqlClient.SqlException: оператор INSERT конфликтовал с ограничением FOREIGN KEY "FK_dbo.Equipments_dbo.CarModels_CarModelId".Конфликт произошел в базе данных "D: \ AUTOSTORE \ AUTOSTORE \ APP_DATA \ AUTOSTOREDB.MDF", таблице "dbo.CarModels", столбце "Id".Заявление было прекращено.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы пытались присоединить эти объекты к вашему DbContext?Даже если в вашей базе данных есть эти объекты, средство отслеживания изменений, связанное с DbContext, должно знать об их существовании, если вы хотите SaveChanges.В ситуациях, подобных этой, проще всего присоединить их вручную:

Mark mark = new Mark() { Id = 1 };
db.Marks.Attach(mark);

CarModel carModel = new CarModel() { Id = 1 };
db.CarModels.Attach(carModel);

Затем вы можете связать их с экземпляром вашего автомобиля:

car.CarModel = carModel;
car.Mark = mark;

И это должно работать, потому что, какВ документе говорится о Attach:

Присоединение используется для повторного заполнения контекста сущностью, которая, как известно, уже существует в базе данных .Следовательно, SaveChanges не будет пытаться вставить присоединенный объект в базу данных, поскольку предполагается, что он уже существует.Обратите внимание, что для сущностей, которые уже находятся в контексте в каком-либо другом состоянии, их состояние будет установлено как Не изменено.Присоединение не допускается, если объект уже находится в контексте в неизмененном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...