2013-05-02 3 views
2

У нас есть поле в нашей таблице базы данных SQL Server, которая автоматически генерируется SQL Server, поле называется CreatedTime.Как игнорировать конкретное поле из модели Entity при вставке?

Мы отобразили всю таблицу базы данных в наш datamodel в Entity Framework, а также поле CreatedTime.

Когда мы вставляем новую строку в базу данных через Entity Framework, мы таким образом не даем никакого значения для CreatedTime.

Это приводит к тому, вставка на неудачу с ошибкой:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM

Итак, вопрос: есть ли способ, чтобы исключить определенное поле в DataModel Entity в Entity Framework вставки заявление? Чтобы мы не получили вышеуказанную ошибку?

Мы хотели бы оставить поле CreatedTime в модели Entity, потому что мы можем захотеть получить к нему доступ позже.

ответ

3

я нашел простое решение проблемы на этой теме:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/7db14342-b259-4973-ac09-93e183ae48bb

Там Фернандо Сото пишет:

«Если вы идете к дизайнеру EDM, щелкните по полю в таблице, которое автоматически создается базой данных, щелкните его правой кнопкой мыши и выберите« Свойства »и« », посмотрите на окна свойств, нажмите« StoreGeneratedPattern »и установите его значение для Вычислил, я считаю, что он даст вам то, что вы ищете ».

Вышеупомянутое решение было очень быстрым и легким, и, похоже, оно работает.

Также благодарю вас за ваши ребята, но вышеупомянутое решение, похоже, выполняет эту работу.

+0

это будет сохраняться после обновления модели из базы данных? – n00b

0

Is CreatedTime nullable?

Одним из возможных обходного пути - если CreatedTime НЕ обнуляемый:

DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0); 

if(myEntity.CreatedTime < sqlServerMinDateTime) 
{ 
    myEntity.CreatedTime = sqlServerMinDateTime; 
} 

// do insert here 
// .... 

Одним из возможных обходного пути - если CreatedTime обнуляемый:

DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0); 

if(myEntity.CreatedTime < sqlServerMinDateTime) 
{ 
    myEntity.CreatedTime = null; 
} 

// do insert here 
// .... 
1

th прежде чем две вещи, которые вы можете сделать:

  1. Если у вас есть доступ к базе данных, проверьте, если поле имеет значение default. Если это не так, вы можете установить его на GETDATE(), и поле должно быть установлено правильно, и вам не нужно добавлять/обновлять его через Entity Framework.

  2. Если у вас нет доступа к базе данных или вы не хотите вносить туда какие-либо изменения, вы можете изменить поведение модели данных сущности для автоматической установки даты. Просто расширьте модель объекта ObjectContext.

    public partial class MyEntities 
    { 
        public override int SaveChanges() 
        { 
         var entityChangeSet = ChangeTracker.Entries<SomeEntity>(); 
         if (entityChangeSet != null) 
         { 
          foreach (DbEntityEntry<SomeEntity> entry in entityChangeSet) 
          { 
           switch (entry.State) 
           { 
            case EntityState.Modified: 
             entry.Entity.LastModifiedDate = DateTime.UtcNow; 
             break; 
            case EntityState.Added: 
             entry.Entity.CreatedDate = DateTime.UtcNow; 
             break; 
           } 
          } 
         } 
         return base.SaveChanges(); 
        } 
    } 
    

Таким образом, вам не нужно добавлять какую-либо информацию для тех полей при добавлении или обновлении элемента, модель сделает это за вас.Если у вас есть несколько объектов, которые нуждаются в таком поведении, вы можете создать интерфейс и сделать классы сущностей наследуют, что:

public interface IHaveCreatedDate { 
    DateTime CreatedDate { get; set; } 
} 

public partial class MyEntity : IHaveCreatedDate { 
    //MyEntity already implements this! 
} 

Тогда все, что вам нужно сделать, это изменить вызов к ChangeTracker:

var entityChangeSet = ChangeTracker.Entries<IHaveCreatedDate>(); 
3

При использовании Fluent API:

using System.ComponentModel.DataAnnotations.Schema; 

this.Property(t => t.CreatedTime) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

При использовании аннотаций

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public System.DateTime CreatedTime { get; set; } 
Смежные вопросы