我正在使用的查询是:
int? UserId = db.StudentModel//the question mark here makes the int nullable
.Where(c => c.UserName == certUserName)
.Select(c => c.UserId)
.First();
不幸的是,这仅在数据库具有主键时才有效。由于数据库的特定结构和使用,不能有主键。即使没有PK,如何修改我的搜索以从数据库中提取完全相同的内容?
编辑:对不起!我应该更加明确。我猜错误本身并不在于实际查询,而在于模型的设置方式:在模型生成期间检测到一个或多个验证错误:
IronGriffin.Models.CompletionsModel :: EntityType'CompletionsModel' 没有定义键。定义此EntityType的密钥。
完成:EntityType:EntitySet'Completions'基于类型 'CompletionsModel'没有定义键。
话虽如此,问题仍然是没有定义主键。我想如果通过搜索主键搜索不起作用,这将全部起作用(除非它没有?我以为我在某处读到它的工作原理)
答案 0 :(得分:8)
不幸的是,这仅在数据库具有主键时才有效。由于数据库的特定结构和使用,因此不能成为主键。
两件事:首先,数据库没有主键,表没有。我假设您的意思是您的数据库中有表,但没有为其定义主键。
这导致第二:使用Entity Framework,每个实体都必须有一个主键。这是EF的要求,与搜索无关。如果EF看到没有密钥的实体,EF甚至不愿意尝试生成数据库的概念模型,因此搜索变得不可能。
您有两种选择:
找出一种将主键放在桌面上的方法。如果你能够改变你的表格定义,那么它就没有理由不具备主键。如果没有您可以选择的自然键,请添加代理键,如标识字段。关键是什么并不重要,它必须保证每一行都是唯一的。它甚至不必只是一个字段:EF支持使用复合键,例如:
modelBuilder.Entity<Foo>.HasKey(e => new { e.Field1, e.Field2 });
不要使用实体框架。假设您可以弄清楚如何正确编写查询,SQL Server查询没有主键的数据库表没有问题。您可以随时使用ADO.NET访问您的数据库,您只是不会获得EF的任何其他好处。
答案 1 :(得分:2)
稍微提示一下,因为我从另一个线程LINK知道你的结构。 可以在完成表中有一个主键,但它应该包含两个键。
它看起来像
[Table("Completion")]
public class CompletionsModel
{
[Column(Order = 0), Key]
public int UserId { get; set; }
[Column(Order = 1), Key]
public string PRD_NUM { get; set; }
public DateTime CompletionDate { get; set; }
public virtual CourseModel PRD { get; set; }
public virtual StudentModel UserProfile { get; set; }
}
主键确实让生活更轻松; - )
答案 2 :(得分:1)
EF要求表格有主键
Error 159: EntityType has no key defined
和其他此类错误
使用linq to sql或Stored proc