7

我已经查看了很多关于 SO 的其他问题,但无法得到答案。我在表格中有一个名为:Sex - Male

我想了解命名它的人,因为它给我带来了 EF 的问题。如果我使用这个:

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

这给了我与模型不兼容的错误,因为找不到“Sex”字段。所以我改成这样:

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

然后我收到消息 Invalid Column Name [Sex - Male]。EF是否以某种方式重命名带有空格的列,因为该字段确实存在并且不是任何类型的FK?

编辑

我发现在模型构建器中这样做:

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

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

编辑 2

我创建了一个新应用程序并使用模型设计器来查看它如何解释该列并在设计器中将其显示为“Sex___Male”,但是,即使在它周围有 [] 的情况下,将类更改为这个仍然让我找不到列性别男??

编辑 3

看来错误并不是我想的那样,我发现当我只使用 db.Students 时映射配置工作正常;并且该列按预期存在。原来出错的地方是这条线:

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

所以很明显,我猜测的 ExecuteStoreQuery 不会使用相同的映射配置,因此认为该列缺失。不知道为什么将 Column 注释放在类中的属性上不起作用?

4

2 回答 2

2

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

  • SQL Server 2012
  • 视觉工作室 2013
  • 实体框架 6.0.1

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

创建了一个表:

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");
于 2013-11-05T15:11:05.373 回答
1

似乎 Entity Framework 本身在映射此列的正常使用方面没有问题,但是我遇到的问题是我使用 ExecuteStoreQuery 方法映射模型的地方。

事实证明,使用这意味着您将其映射到的任何内容都必须具有相同的名称,而不管您为列添加的任何数据注释(它们似乎只是被忽略了)。我所做的只是用我需要的字段创建一个小类,并将查询的 sql 更改为 Select StudentID As ID, [Sex - Male] As Sex, ...other fields 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);

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

于 2013-11-07T16:10:39.587 回答