实体框架无效列

时间:2013-10-31 15:33:51

标签: c# entity-framework

我已经看了很多关于SO的其他问题,但无法得到答案。我在表格中有一个专栏:性别 - 男性

我想亲自动手,无论是谁给它命名,因为它给了我EF的问题。如果我用这个:

[Column("Sex - Male")]
public bool Sex { get;set; }

这给了我与模型不兼容的错误" Sex"无法找到。所以我改为:

[Column("[Sex - Male]")]
public bool Sex { get;set; }

然后我收到消息无效列名[性别 - 男性]。 EF是否以某种方式使用空格重命名列,因为该字段确实存在并且不是任何类型的FK?

修改

我发现在模型构建器中执行此操作:

modelBuilder.Entity<Student>().Property(x => x.Sex).HasColumnName("Sex - Male");

导致出现相同的错误,表示它不兼容,因为没有名为Sex的列具有相同的名称!我注意到它出现在我使用Column数据注释的任何东西上,而不仅仅是这个字段!

编辑2

我创建了一个新的应用程序并使用模型设计器来查看它如何解释列并在设计器中显示为&#34; Sex ___ Male&#34;然而,即使使用[]&#39也将类更改为此类在它周围仍然给我找不到专栏性___男???

编辑3

看起来错误并不是我想的,我发现当我使用db.Students时,映射配置工作正常;并且列符合预期。 事实证明这个区域出现了错误:

var students = (db as IObjectContextAdapter).ObjectContext.ExecuteStoreQuery<Student>(sql);

因此,显然我猜测的ExecuteStoreQuery不会使用相同的映射配置,因此会将列视为缺失。不确定为什么将Column annotation放在类中的属性上并不起作用?

2 个答案:

答案 0 :(得分:2)

我在测试配置中重新创建了你的情况。我能够使用以下配置成功插入和查询数据

  • SQL Server 2012
  • Visual Studio 2013
  • Entity Framework 6.0.1

如果您使用的是旧版本的Entity Framework,我会考虑更新;这很可能是原因,但是我无法重现你的环境所以这个答案只是猜测。我用了这段代码:

创建了一个表:

create table MyTable2 (
[pk] int not null identity primary key, 
[Sex - Male] bit not null);

类别:

public class MyTable2
{
    public int pk { get; set; }
    public bool Sex { get; set; }
}

映射配置:

this.HasKey(t => t.pk);
this.Property(t => t.Sex).HasColumnName("Sex - Male");

答案 1 :(得分:1)

看来实体框架本身没有关于它的正常使用的问题,但我遇到的问题是我使用ExecuteStoreQuery方法来映射模型。

事实证明,使用这种方法,无论您为列添加任何数据注释,它们映射到的任何内容都必须具有相同的名称(它们似乎只是被忽略)。我所做的只是用我需要的字段创建一个小类,并将查询的sql更改为Select StudentID As ID,[Sex - Male] As Sex,...其他字段FROM ... etc ie

public class StudentReadOnly 
{
    public int ID { get; set; }
    public bool Sex { get;set; }
    ... other properties
}

然后将行改为:

var students = (db as IObjectContextAdapter).ObjectContext.ExecuteStoreQuery<StudentReadOnly>(sql);

没有问题。我还发现,与普通的ef查询不同,你在类中放置的任何属性都必须存在于sql查询中。