2013-10-17 3 views
1

Я использую EF 4.3, и я вносил небольшие изменения в мои объекты, но ни один из классов сущностей, которые являются частью этой ошибки , Я хотел бы понять, почему это началось внезапно.Как исправить «Недопустимое имя столбца« Дискриминатор »« Ошибка структуры Entity

Мои классы:

public class Apple: Fruit 
    { 
     public Color Color{ get; set; } 
    } 

    public class Fruit: EntityBase 
    { 
     public int Size{ get; set; } 
     public DateTime? DateGrown{ get; set; } 
     public User GrownBy{ get; set; } 
     public User SoldBy{ get; set; } 
    } 

public class EntityBase 
{ 
     public int Id{ get; set;} 
} 

Линия, которая теперь бросает "Неверное имя столбца 'Дискриминатор'":

repository.Apples.Include("GrownBy").Include("SoldBy") 
      .Where(r => r.GrownBy.Id == user.Id 
      || r.SoldBy.Id == user.Id).ToList(); 

Если я копирую SQL, что repository.Apples пытается и запускать его в SSMS, он работает очень хорошо:

SELECT 
[Extent1].[Id] AS [Id], 
'0X0X' AS [C1], 
[Extent1].[DateGrown] AS [DateGrown], 
[Extent1].[Color] AS [Color], 
[Extent1].[DateGrown] AS [DateGrown], 
[Extent1].[GrownBy_Id] AS [GrownBy_Id], 
[Extent1].[SoldBy_Id] AS [SoldBy_Id], 
[Extent1].[Size] AS [Size], 
FROM [dbo].[Fruits] AS [Extent1] 
WHERE [Extent1].[Discriminator] = N'Apple' 

Я попытался добавить [NotMapped] Аннотация данных, как recommmended @EF Code First "Invalid column name 'Discriminator'" but no inheritance, как:

[NotMapped] 
    public class Apple: Fruit 
    { 
     public Color Color{ get; set; } 
    } 

но создает новую ошибку:

The type 'Domain.Entities.Apple' was not mapped. Check that the type has not been explicitly excluded by using the Ignore method or NotMappedAttribute data annotation. Verify that the type was defined as a class, is not primitive, nested or generic, and does not inherit from EntityObject.

на следующей строке:

 _context.Database.Initialize(true); 

На самом деле начинаю сожалеть об использовании EF, поскольку он постоянно вызывает такие новые проблемы, как это каждую неделю. Если кто-то может дать какое-либо представление о исправлении, мы будем весьма признательны.

EDIT: Таким образом, похоже, что это не имеет ничего общего с объектами Fruit или Apple. Я добавил унаследованный класс объекта User, и это то, что заставляет вещи сломаться.

ответ

1

Похоже, что существует ошибка в сопоставлении базы данных SQL с кодом First или с кодом C#.

Если вы считаете, что SQL-запрос работает нормально через SSMS, выполните следующие шаги. a) Откройте проектное решение, нажмите «Добавить», затем «Новый элемент», затем выберите «онлайн», там, в поисковом столбце, введите POCO ..

b) Установите обратный poco..make sure, изначально у вас есть имя строки подключения appconfig как MyDbContext .. c) как только класс poco сгенерирован, вы можете видеть, что ваша БД отображается в коде C#.

Теперь, как вы ваш запрос правильно, то попробуйте с

[your_dbContext] .Database.ExecuteSqlCommand(); или [your_dbContext]. [TableName] .SqlQuery («писать ваши запросы в формате RAW SQL»). ToList();

0

Сначала покажите свой dbContext. Теперь попробуйте добавить столбец вручную в таблицу, как это:

ALTER TABLE MY_TABLE ADD MY_COLUMN NVARCHAR NULL 

UPDATE [MY_TABLE] SET [MY_COLUMN]=0 WHERE [MY_COLUMN] IS NULL 

ALTER TABLE MY_TABLE ALTER COLUMN MY_COLUMN NVARCHAR NOT NULL 

это добавляет не нулевой столбец в таблицу, так как я уверен, что рамки предприятия добавили бы это так.Кроме того, если вы установите AutomaticMigrationEnabled к истинным, оно должно быть сделано, что для вас (я думаю, вы должны попробовать, что до запроса), как это:

internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 

     } 

     protected override void Seed(MyDbContext context) 
     { 

      // This method will be called after migrating to the latest version. 

      // You can use the DbSet<T>.AddOrUpdate() helper extension method 
      // to avoid creating duplicate seed data. E.g. 
      // 
      // context.People.AddOrUpdate(
      //  p => p.FullName, 
      //  new Person { FullName = "Andrew Peters" }, 
      //  new Person { FullName = "Brice Lambson" }, 
      //  new Person { FullName = "Rowan Miller" } 
      // ); 
      // 
     } 
    } 

Как вы можете видеть, это Configuration.cs Класс, созданный при включении миграции. надеюсь, это поможет немного.

Смежные вопросы