C# 如何查询没有主键的数据库表
我使用的查询是:C# 如何查询没有主键的数据库表,c#,sql,linq,entity-framework,asp.net-mvc-4,C#,Sql,Linq,Entity Framework,Asp.net Mvc 4,我使用的查询是: int? UserId = db.StudentModel//the question mark here makes the int nullable .Where(c => c.UserName == certUserName) .Select(c => c.UserId) .First(); 不幸的是,这只在数据库有主键的情况下起作用。由于数据库的特定结构和用途,
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“完成”基于类型
没有定义键的“CompletionsModel”
尽管如此,问题仍然是没有定义主键。我想,如果搜索没有通过搜索主键来起作用(除非它没有起作用?我想我在某个地方读到了它是如何工作的)EF需要一个表来有主键。
错误159:EntityType没有定义键
和其他此类错误。使用linq到sql或存储过程 不幸的是,这只在数据库有主键的情况下起作用。由于数据库的特定结构和用途,不能有主键 两件事:首先,数据库没有主键,表有主键。我假设您的意思是,您的数据库中有一个没有定义主键的表 这导致了第二个问题:要使用实体框架,每个实体都必须有一个主键。这是EF的要求,与搜索无关。如果EF看到一个没有键的实体,它甚至不会尝试生成数据库的概念模型,因此搜索变得不可能 您有两个选择:
modelBuilder.Entity.HasKey(e=>new{e.Field1,e.Field2})代码>
我从另一个线程知道你的结构。在完成表中可以有一个主键,但它应该由两个键组成 然后看起来像
[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; }
}
主键确实让生活更轻松;-) 你说的“只工作”是什么意思?你是说像这样吗。这篇文章有一些很好的观点,主要是:没有主键的表是个坏主意。嗨,你能给我们一些更多的信息吗?例如,当你尝试上面的代码时,你会得到什么错误消息?你试过什么?当您研究如何查询没有主键的表时发生了什么?你能告诉我们为什么桌子需要没有钥匙等吗?您提供的任何信息都将帮助我们解决您的问题:)您认为这是一个坏主意,这是正确的,但在这种情况下,这是必要的。无论表是否有主键,该查询都将工作。它将从表中具有匹配的
用户名的第一条记录中获取UserId
值。重要的是这两列是存在的。如果它没有主键,它就不是一个表-旧的SQL语句,这是有效的!我不知道,没有PK,实体框架实际上根本无法运行。虽然我不需要一个用于任何传统用途,我想这是足够的理由把一个!谢谢。我没有接受这个答案,只是因为我接受的那个正好提供了修复问题所需的原始代码。话虽如此,你的答案信息量惊人,所以我至少投了你一票。如果我能接受两个答案,即使是以代表的代价,我也一定会给你一个;我倾向于避免对实体的特定于模式的方面进行数据注释,并使用fluent api,否则我会向您展示与答案基本相同的内容:)