如何查询没有主键的数据库表

时间:2014-07-30 00:51:28

标签: 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();

不幸的是,这仅在数据库具有主键时才有效。由于数据库的特定结构和使用,不能有主键。即使没有PK,如何修改我的搜索以从数据库中提取完全相同的内容?

编辑:对不起!我应该更加明确。我猜错误本身并不在于实际查询,而在于模型的设置方式:

  

在模型生成期间检测到一个或多个验证错误:

     

IronGriffin.Models.CompletionsModel :: EntityType'CompletionsModel'   没有定义键。定义此EntityType的密钥。

     

完成:EntityType:EntitySet'Completions'基于类型   'CompletionsModel'没有定义键。

话虽如此,问题仍然是没有定义主键。我想如果通过搜索主键搜索不起作用,这将全部起作用(除非它没有?我以为我在某处读到它的工作原理)

3 个答案:

答案 0 :(得分:8)

  

不幸的是,这仅在数据库具有主键时才有效。由于数据库的特定结构和使用,因此不能成为主键。

两件事:首先,数据库没有主键,表没有。我假设您的意思是您的数据库中有,但没有为其定义主键。

这导致第二:使用Entity Framework,每个实体都必须有一个主键。这是EF的要求,与搜索无关。如果EF看到没有密钥的实体,EF甚至不愿意尝试生成数据库的概念模型,因此搜索变得不可能。

您有两种选择:

  1. 找出一种将主键放在桌面上的方法。如果你能够改变你的表格定义,那么它就没有理由不具备主键。如果没有您可以选择的自然键,请添加代理键,如标识字段。关键是什么并不重要,它必须保证每一行都是唯一的。它甚至不必只是一个字段:EF支持使用复合键,例如:

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

  2. 不要使用实体框架。假设您可以弄清楚如何正确编写查询,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