实体类型未定义键EF6

5

这是我的代码,虽然我已经优化了关键属性,但仍存在问题。

public class Contacts
{
    [Key]
    public int ContactId { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
}

我收到的错误信息是:
实体类型“Contacts”未定义键。请为此实体类型定义键。
实体类型:基于未定义键的类型“Contacts”的实体集“Contacts”

1
真的吗?在设置了“Key”属性后,您是否重新构建了?此外,我更愿意将类称为“Contact”,因为它代表一个联系人,而不是一组联系人。 - Gert Arnold
是的@Gert,我已经重新构建了它,但问题在于类和ID的命名约定。无论如何,谢谢 :) - Affuu
2
好吧,你很棒,但这没有意义。关键属性应该足够了。我认为还有其他事情发生了。 - Gert Arnold
请查看此链接:https://dev59.com/42Qo5IYBdhLWcg3wQNX4#45372519,这是您的答案。 - saurav singh
2个回答

7
如果您正在使用EF Code First(未在您的问题中指定),则需要将ContactId属性名称更改为ContactsId,以匹配 ClassName + Id的约定,以定义 Contacts 实体类型的键。
请参阅MSDN Code First Conventions:http://msdn.microsoft.com/en-us/data/jj679962.aspx

1
当存在Key属性时,约定不会执行任何操作。 - Gert Arnold

0

我知道这个问题已经以某种方式得到了解答,但我想为那些遇到此问题的人提供不同的方法。

即使在我想指定为主键的属性上方定义了[Key],我仍然遇到了这个错误。在执行Update-Database命令时发生的错误是由于我将迁移(通过Add-Migration)的命名与我想要添加的实体相同。这是因为Add-Migration命令创建了一个与实体名称匹配的部分类。

例如:

public class Contacts
{
    [Key]
    public int ContactId { get; set; }
    public string Name { get; set; }
}

执行时没有起作用:

Add-Migration Contacts
Update-Database

因为迁移类的签名看起来像下面这样,并且内部没有带有[Key]属性的属性。
public sealed partial class Contacts

为了解决这个问题,我删除了同名的迁移并修改了Add-Migration命令:
Add-Migration ContactsTable
Update-Database

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接