Entity Framework: жалуется на нулевой идентификатор, когда идентификатор объекта установлен в коде во время SaveChanges - PullRequest
1 голос
/ 19 января 2011

Предположим, что следующий код обрабатывает событие SaveChanges объекта DataContext

void Context_SavingChanges(object sender, EventArgs e)
    {

        IEnumerable<ObjectStateEntry> objectStateEntries =
            from ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted)
            where ose.Entity != null
            select ose;

        foreach (ObjectStateEntry entry in objectStateEntries)
        {
            foreach (var field in entry.CurrentValues.DataRecordInfo.FieldMetadata)
            {
                var guid = Guid.NewGuid();
                AuditEntry audit = AuditEntry.CreateAuditEntry(
                    id: guid,
                    entitySet: entry.EntitySet.Name,
                    typeName: entry.Entity.GetType().Name,
                    entityId: (entry.CurrentValues["Id"] as string) ?? ((entry.State == EntityState.Added) ? "New" : null),
                    oldValue: (entry.State != EntityState.Added) ? entry.OriginalValues[field.FieldType.Name].ToString() : "New",
                    newValue: (entry.State != EntityState.Deleted) ? entry.CurrentValues[field.FieldType.Name].ToString() : "Deleted",
                    modifier: Environment.UserDomainName + "\\" + Environment.UserName,
                    dbAction: Enum.GetName(typeof(EntityState), entry.State),
                    field: field.FieldType.Name,
                    dateStamp: DateTime.Now
                );


                this.AuditEntries.AddObject(audit);
            }
        }
    }

Когда я создаю новый объект и пытаюсь сохранить его изменения, я получаю эту ошибку:

Невозможно вставить значение NULL в столбец «Id», таблица «TimeEF.dbo.AuditEntries»; столбец не допускает пустых значений. Вставить не удается. Заявление было прекращено.

Когда, как вы видите, я установил Id, есть идеи? Ошибка?

1 Ответ

8 голосов
/ 27 февраля 2012

Вы изучили столбец id вашего объекта в файле EDMX? Если его атрибут StoreGeneratedPattern помечен как «вычисленный» или «идентификатор», то EF не будет переносить значение C # в свой оператор SQL. Установите для атрибута StoreGeneratedPattern значение «Нет», и SQL, который пишет Entity Framework, будет содержать значение, созданное в C # для идентификатора.

<EntityType Name="AuditEntry">
    //...
    <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="None" />
    //...
</EntityType>

Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/dd296755(v=vs.90).aspx.

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