1

我正在使用 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;}
 }

现在抛出"Invalid column name '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] Data Annotation 添加为推荐的 @ EF Code First "Invalid column name 'Discriminator'" 但没有继承,例如:

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

但它会产生一个新错误:

未映射类型“Domain.Entities.Apple”。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否被显式排除。验证该类型是否被定义为一个类,不是原始的、嵌套的或泛型的,并且不是从 EntityObject 继承的。

在以下行:

       _context.Database.Initialize(true);

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

编辑: 所以看起来它与 Fruit 或 Apple 实体完全无关。我添加了用户实体的继承类,这就是导致事情中断的原因。

4

2 回答 2

1

将 SQL 数据库映射到 Code First 或 C# 代码时似乎存在错误。

如果您认为 SQL 查询通过 SSMS 可以正常工作,请按照以下步骤操作。a) 打开项目解决方案,单击添加,然后单击新建项目,然后选择在线,在搜索栏中输入 POCO..

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

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

[your_dbContext].Database.ExecuteSqlCommand(); 或 [your_dbContext].[TableName].SqlQuery("写你的 RAW SQL 查询").ToList();

于 2013-10-17T11:09:21.673 回答
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 类。希望这会有所帮助。

于 2014-12-05T18:55:57.653 回答