如何修复“无效列名'判别器'”实体框架错误

时间:2013-10-17 02:09:22

标签: c# entity-framework entity-framework-4

我正在使用EF 4.3并且我一直在对我的实体进行一些小的更改,但是没有一个实体类是这个错误的一部分。我想明白为什么这一切突然开始发生。

我的课程:

  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;}
 }

现在正在抛出“无效的列名称'Discriminator'”的行

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

如果我复制了repository.Apples试图运行的SQL,并在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]数据注释作为推荐@ EF Code First "Invalid column name 'Discriminator'" but no inheritance,如:

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

但它会产生新的错误:

  

未映射“Domain.Entities.Apple”类型。检查类型   尚未使用忽略方法或明确排除   NotMappedAttribute数据注释。验证是否已定义类型   作为一个类,不是原始的,嵌套的或通用的,并且不继承   来自EntityObject。

在以下一行:

       _context.Database.Initialize(true);

真的开始后悔使用EF因为它似乎每周都会出现像这样的新问题。如果任何人都能提供任何有关修复的见解,我们将不胜感激。

修改 因此看起来它与Fruit或Apple实体完全无关。我添加了一个继承的User实体类,这就是导致内容破坏的原因。

2 个答案:

答案 0 :(得分:1)

看起来将SQL数据库映射到Code First或C#代码时出现错误。

如果您认为SQL查询通过SSMS正常工作,请按照以下步骤操作。 a)打开Project Solution,单击Add,然后单击New Item,然后选择online,在搜索列中输入POCO ..

b)安装反向poco ..确保,最初你的appconfig连接字符串名称为MyDbContext .. c)生成poco类后,您可以看到您的数据库是用C#代码映射的。

现在,正如你的sql查询是正确的,然后尝试使用

[your_dbContext] .Database.ExecuteSqlCommand(); 或[your_dbContext]。[TableName] .SqlQuery(“编写RAW SQL查询”)。ToList();

答案 1 :(得分: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设置为true,它应该为你完成(我认为你应该在查询之前尝试),如下所示:

 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类。希望这会有所帮助。