use*_*905 7 c# entity-framework
我在SO上看了很多其他问题,但无法得到答案.我在一张名为"性 - 男性"的表格中有一列
我希望得到任何一个名字的人,因为它给了我EF的问题.如果我用这个:
[Column("Sex - Male")]
public bool Sex { get;set; }
Run Code Online (Sandbox Code Playgroud)
这给了我与模型不兼容的错误,因为无法找到"Sex"字段.所以我改为:
[Column("[Sex - Male]")]
public bool Sex { get;set; }
Run Code Online (Sandbox Code Playgroud)
然后我收到消息无效列名[性别 - 男性].EF是否以某种方式重命名具有空格的列,因为该字段确实存在并且不是任何类型的FK?
编辑
我发现在modelBuilder中这样做:
modelBuilder.Entity<Student>().Property(x => x.Sex).HasColumnName("Sex - Male");
Run Code Online (Sandbox Code Playgroud)
导致出现相同的错误,说它不兼容,因为没有名为Sex的列具有相同的名称!我注意到它出现在我使用Column数据注释的任何东西上,而不仅仅是这个字段!
编辑2
我创建了一个新的应用程序,并使用模型设计器来查看它如何解释列并在设计器中将其显示为"Sex___Male",然而,即使用[]在它周围将类更改为此仍然无法找到列性别男??
编辑3
看来错误并不是我想的那样,我发现当我使用db.Students时,映射配置工作正常; 并且列符合预期.原来这个区域出错的是这条线:
var students = (db as IObjectContextAdapter).ObjectContext.ExecuteStoreQuery<Student>(sql);
Run Code Online (Sandbox Code Playgroud)
因此,我猜测的ExecuteStoreQuery显然不会使用相同的映射配置,因此会将列视为缺失.不确定为什么将Column annotation放在类中的属性上却不起作用?
实体框架本身在正常使用方面映射此列似乎没有问题,但我遇到的问题是我使用 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
}
Run Code Online (Sandbox Code Playgroud)
然后将行更改为:
var students = (db as IObjectContextAdapter).ObjectContext.ExecuteStoreQuery<StudentReadOnly>(sql);
Run Code Online (Sandbox Code Playgroud)
并且没有任何问题。我还发现,与通常的 ef 查询不同,您放入类中的任何属性都必须存在于 sql 查询中。