实体框架无效的列

我看过很多关于SO的其他问题,但无法得到答案。 我在一张名为性别 - 男性的表格中有一栏

我希望得到我的支持,因为它给了我EF的问题。 如果我使用这个:

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

这给了我与模型不兼容的错误,因为无法找到“性别”字段。 所以我改变了这个:

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

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

编辑

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

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

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

编辑2

我创建了一个新的应用程序,并使用模型设计器来了解它是如何解释列并在设计器中将其显示为“Sex___Male”,但是,即使使用[]的方式将类更改为此,仍然会让我无法找到列性别男??

编辑3

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

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

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


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

  • SQL Server 2012
  • Visual Studio 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");
    

    看起来,实体框架本身没有问题映射这个列关于它的正常使用,但我有问题是我在哪里使用ExecuteStoreQuery方法映射模型。

    事实证明,使用这种方式意味着您映射它的任何内容都必须具有相同的名称,而不管您为列添加的任何数据注释(它们看起来只是被忽略)。 我做的是做一个只有我需要的字段的小班,并改变了查询的sql来选择StudentID As ID,[Sex - Male] As Sex,...其他字段FROM ...等

    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查询中。

    链接地址: http://www.djcxy.com/p/16909.html

    上一篇: Entity Framework Invalid Column

    下一篇: Responsive tables, the smart way