Ошибка при извлечении данных из представления базы данных с использованием code first

#c# #.net #entity-framework

#c# #.net #entity-framework

Вопрос:

У меня есть представление в моей базе данных SQL. Все, что я хочу, это извлечь данные из этого представления.

Я добавил класс POCO.

 namespace WFPersistence.DataModel
{
     public class Instance
     {
         public Guid InstanceId { get; set; }
         public DateTime? PendingTimer { get; set; }
         public DateTime? CreationTime { get; set; }
         public DateTime? LastUpdatedTime { get; set; }
         public int? ServiceDeploymentId { get; set; }
         public string SuspensionExceptionName { get; set; }
         public string SuspensionReason { get; set; }
         public string ActiveBookmarks { get; set; }
         public string CurrentMachine { get; set; }
         public string LastMachine { get; set; }
         public string ExecutionStatus { get; set; }
         public bool? IsInitialized { get; set; }
         public bool? IsSuspended { get; set; }
         public bool? IsCompleted { get; set; }
         public byte? EncodingOption { get; set; }
         public byte[] ReadWritePrimitiveDataProperties { get; set; }
         public byte[] WriteOnlyPrimitiveDataProperties { get; set; }
         public byte[] ReadWriteComplexDataProperties { get; set; }
         public byte[] WriteOnlyComplexDataProperties { get; set; }
         public string IdentityName { get; set; }
         public string IdentityPackage { get; set; }
         public long? Build { get; set; }
         public long? Major { get; set; }
         public long? Minor { get; set; }
         public long? Revision { get; set; }
     }

     public class Instances : Collection<Instance>
     {
     }
}
  

Вот как я пытаюсь сопоставить с view.

  public class WFPersistenceStore : DbContext
 {
     public WFPersistenceStore() : base("WFPersist")
     {
     }

     public DbSet<Instance> PersistedInstances { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
         modelBuilder.Entity<Instance>().ToTable("System.Activities.DurableInstancing.Instances");
     }
 }
  

Вот как я соединяюсь с view

 using (var PersistStore = new WFPersistenceStore())
{
    var result = from t in PersistStore.PersistedInstances
                 select t;
    ////
    ///
}
  

Я получаю эту ошибку:

Необработанное исключение типа ‘System.ArgumentException’ произошел в RentalHost.exe

Дополнительная информация: имя базы данных ‘System.Деятельность.Прочная установка.Экземпляры» недопустимо. Имена баз данных должны иметь вид [.].

Комментарии:

1. Имя вашей таблицы должно быть в форме [схема]. [имя_объекта] — попробуйте переименовать его.

2. Я пытался таким образом, но затем он жалуется, что модель не соответствует и нуждается в обновлении. Потому что в этом случае он соответствует моему классу POCO с фактической схемой таблицы, а не со схемой представления. Надеюсь, вы поняли, что я имею в виду.

Ответ №1:

Ваш метод должен быть похож

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Instance>().ToTable("Instances");
        }
  

Комментарии:

1. Даже в этом случае он выдает ту же ошибку «Модель, поддерживающая контекст ‘WFPersistenceStore’, изменилась с момента создания базы данных. Рассмотрите возможность использования миграции Code First для обновления базы данных ( go.microsoft.com/fwlink/?LinkId=238269 )».

Ответ №2:

Я решил свою проблему, просто поместив следующую строку внутри конструктора моего контекстного класса (т. Е. WFPersistenceStore).

 Database.SetInitializer<WFPersistenceStore>(null);
  

Это нигде четко не упоминалось в официальных документах, если я не ошибаюсь.

Приведенная выше строка необходима EF6 только для версии, но не требуется для более ранних версий EF.