Entity Framework Non Identity-не удается вставить значение NULL в столбец "ID"



У меня есть таблица с первичным ключом ID, это поле не является столбцом identity. Моя миграция для Entity Framework 6 является



 CreateTable(
"dbo.Action",
c => new
{
ID = c.Int(nullable: false, identity: false),
ActionName = c.String(maxLength: 50),
})
.PrimaryKey(t => t.ID);


Все это выглядит довольно прямолинейно для меня. Затем у меня есть метод для посева некоторых данных:



public static void Seed(this DbSet<Action> entitySet)
{
MainContext dbCtx = DataRepositoryBase<Action>.GetContext(entitySet) as MainContext;
if (dbCtx != null)
{
entitySet.Add(new Action()
{
ID = 1,
ActionName = "Test"
});
}
}


Именно в этот момент я получаю ошибку




"невозможно вставить значение NULL в столбец 'ID', таблица ' dbo.Действие';
столбец не допускает нулей. Вставить не удается.r n заявление было
прекращено "




Как вы можете видеть, я я четко значение для столбца ID. Мое подозрение заключается в том, что основа сущности ожидает идентификатор столбца идентификаторов



Класс сущностей очень прост



[DataContract]
public class Action
{
[DataMember]
public int ID { get; set; }

[DataMember]
public string ActionName { get; set; }
}
730   2  

2 ответов:

Ваша миграция только создает таблицу в базе данных, но не сообщает Entity Framework, что свойство ID не является столбцом IDENTITY. EF выбирает свойство ID, если вы не указываете ему, какое свойство использовать в качестве первичного ключа, но вам также нужно сказать EF, что это не столбец идентификаторов, сделайте это с помощью атрибута DatabaseGenerated:

[DataContract]
public class Action
{
    [DataMember]
    [Key] //This isn't technically needed, but I prefer to be explicit.
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

    [DataMember]
    public string ActionName { get; set; }
}

Ошибка связана с тем, что поля name Id должны быть первичным ключом и идентификатором.
Когда оператор EF generate insert не генерирует значение для этого поля.

Вы можете исправить это с помощью

[DataContract]
public class Action
{
    [DataMember]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

    [DataMember]
    public string ActionName { get; set; }
}

Comments

    Ничего не найдено.