Получение «Невозможно вставить значение NULL в столбец» при попытке сохранить с помощью метода .Add () с использованием DbContext. Пожалуйста, проверьте мой POCO и сохраните метод - PullRequest
3 голосов
/ 12 октября 2011

Сначала использовался код, и все, кажется, работает отдельно от приведенного ниже, который также работал раньше, когда я использовал ObjectContext и вызывал context.PCBuilds.AddObject (pcBuild), но после переключения на DbContext выдает ошибку.

EFDbContext context = new EFDbContext();

        public ActionResult Index()
        {
            PCBuild pcBuild = new PCBuild();
            pcBuild.BuildID = 34245;
            pcBuild.BuildName = "Test99";
            pcBuild.MarkUp = 25;
            pcBuild.BDetails = new List<BDetail>();

            context.PCBuilds.Add(pcBuild);

            //repository.PCBuilds.Attach(pcBuild);

            context.SaveChanges();


            return View();
        }

Дайте мне: Cannot insert the value NULL into column 'BuildID', table 'C:\USERS\ADMIN\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\NEOCART\NEOCART.WEBUI\APP_DATA\NEODBX.MDF.dbo.PCBuilds'; column does not allow nulls. INSERT fails. Где, поскольку BuildID был четко установлен до вызова SaveChanges. Похоже, что вызов .Add (pcBuild) по какой-то причине не добавляет заполненный объект, а когда вызывается savechanges, он пытается вставить пустой PCBuild?

Вот POCO's

public class PCBuild
    {
        [Key]
        public int BuildID { get; set; }

        public string BuildName { get; set; }

        public string Socket { get; set; }

        public decimal? MarkUp {get; set;}

        [InverseProperty("PCBuild")]
        public virtual ICollection<BDetail> BDetails { get; set; }



    }


public class BDetail
{
    [Key]
    public int LineID { get; set; }

    [ForeignKey("PCBuild")]
    public int BuildID { get; set; }

    [ForeignKey("Product")]
    public int ProductID { get; set; }

    public bool? IsSelected { get; set; }

    [InverseProperty("BDetails")]
    public virtual PCBuild PCBuild { get; set; }

    [InverseProperty("BDetails")]
    public virtual Product Product { get; set; }


}

Ответы [ 2 ]

5 голосов
/ 12 октября 2011

Используйте StoreGeneratedAttribute в свойстве PCBuild.BuildID.Это не только ключ, но и поле IDENTITY.

ОБНОВЛЕНИЕ На самом деле , это должна быть [DatabaseGenerated(DatabaseGenerationOption.Identity)] аннотация.В приведенной выше статье описывается ранняя версия CTP.

ОБНОВЛЕНИЕ 2 Подождите, ключ генерируется приложением, это не столбец идентификаторов в базе данных?Измените аннотацию на [DatabaseGenerated(DatabaseGenerationOption.None)], заново создайте контекст и пересоберите приложение.

1 голос
/ 12 октября 2011

Я не очень знаком с подходом Code First, но может ли быть так, что когда вы указываете BuildID как поле [Key], оно устанавливает его как поле автоматической идентификации в базе данных?

Возможно, это блокирует вашу попытку записи в него.

Попробуйте удалить идентификатор [Key], а затем заново создать базу данных.Можете ли вы сохранить объект в порядке?

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