实体框架无效的列
我看过很多关于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将不会使用相同的映射配置,因此会将该列视为缺失。 不知道为什么把类注解放在类中的属性不起作用?
我已经在测试配置中重新创建了您的情况。 我能够使用以下配置成功插入和查询数据
如果您使用的是旧版本的实体框架,我会考虑更新; 这很可能是原因,但是我无法重现你的环境,所以这个答案只是一个猜测。 我用这个代码:
创建了一个表格:
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