我目前拥有一个使用Entity Framework的其他人制作的VS解决方案。该解决方案包括一个控制台应用程序,用于测试运行良好的主要功能。
但是,如果我尝试在我自己的VS解决方案中调用这些主要功能(使用dll引用),则会出现以下错误消息:
ConsoleApplication1.Persistence.FileTemplateModel:EntityType 'FileTemplateModel'没有定义键。为此定义密钥 的EntityType。
我通过互联网搜索,我发现这个看起来非常相似: EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType
然而,由于控制台应用程序定义了一个继承继承DbContext的FrameworkDbContext的TestContext,因此它似乎是别的东西。
public partial class FrameworkDbContext : DbContext
{
public FrameworkDbContext(): base("DefaultConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
public class TestContext : FrameworkDbContext
{
public override UserModel CurrentUser
{
get
{
if (_currentUser == null)
{
修改 VS解决方案中的FileTemplateModel(由其他人制作)已经声明哪个属性是主键:
[Table("File.Template", Schema = "Template")]
public class FileTemplateModel : _Auditable
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[HiddenInput(DisplayValue = false)]
public int FileTemplateId { get; set; }
[Required]
[Display(Name = "Type")]
public int FileTemplateTypeId { get; set; }
[ForeignKey("FileTemplateTypeId")]
public virtual FileTemplateTypeModel FileTemplateType { get; set; }
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
事实上,正如我已经提到的,如果我运行控制台应用程序测试包含VS解决方案,一切正常,这意味着FileTemplateModel被正确声明。 问题是当我尝试在一个完全分离的VS解决方案中构建我自己的控制台应用程序时。
GOT IT: 好吧,似乎模型的注释以某种方式丢失了。 所以我决定先在OnModelCreating:
强制使用代码modelBuilder.Entity<FileTemplateModel>().HasKey(x => x.FileTemplateId);
现在一切正常,但我想知道:为什么FileTemplateModel模型上的那些注释不足以定义主键?