我正在使用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实体类,这就是导致内容破坏的原因。
答案 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类。希望这会有所帮助。