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看到一个没有键的实体,它甚至不会尝试生成数据库的概念模型,因此搜索变得不可能

您有两个选择:

  • 找出一种在表上放置主键的方法。如果您能够修改您的表定义,那么没有理由不使用主键。如果没有可以拾取的自然关键点,请添加类似标识字段的代理关键点。不管你的密钥是什么,只要保证每一行都是唯一的。它甚至不必只有一个字段:EF支持使用复合键,例如:

    modelBuilder.Entity.HasKey(e=>new{e.Field1,e.Field2})

  • 不要使用实体框架。SQL Server在查询没有主键的数据库表时没有问题,前提是您能够正确地编写查询。您始终可以直接使用ADO.NET访问数据库,但却无法获得EF的任何其他好处


  • 我从另一个线程知道你的结构。在完成表中可以有一个主键,但它应该由两个键组成

    然后看起来像

    [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,否则我会向您展示与答案基本相同的内容:)