在使用EF6和MVC 5的Code First迁移期间,navigation属性不是类型的声明属性

时间:2015-01-15 09:49:18

标签: c# asp.net-mvc asp.net-mvc-5 entity-framework-6 ef-migrations

我试图将新表添加到现有数据库中。该数据库由MVC 5项目自动创建。在尝试了许多不同的事情后,我没有成功将表Post添加到我的数据库中。

当我跑步时:

PM> Enable-Migrations -ContextTypeName StudentBookApp.Models.PostContext -Force

我收到错误消息:导航属性' PostText'不是类型' Post'的声明属性。验证它是否未从模型中明确排除,并且它是有效的导航属性。

我不明白这个错误,因为PostText它不是导航属性,我不确定为什么实体框架会认为它。

这是我的Post类的定义,在我有PostContext类的类中也是:

public class Post
{
    [Key]
    public int PostId { get; set; }
    public string PostText { get; set; }
    public byte[] ImagePost { get; set; }
    public byte[] FilePost { get; set; }
    public string TextPost { get; set; }
    public string UserId { get; set; }
}

public class PostContext : DbContext
{
    static PostContext()
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PostContext>());
    }

    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new PostConfiguration());
    }
}

我还创建了映射类PostConfiguration:

public class PostConfiguration : EntityTypeConfiguration<Post>
    {
        public PostConfiguration() : base()
        {
            HasKey(p => p.PostId);
            ToTable("Post");

            HasRequired(p => p.PostText);
            ToTable("Post");

            HasOptional(p => p.ImagePost);
            ToTable("Post");

            HasOptional(p => p.FilePost);
            ToTable("Post");

            HasOptional(p => p.TextPost);
            ToTable("Post");

            HasRequired(p => p.UserId);
            ToTable("Post");
        }
    }

我正在尝试进行数据库调用的简单迁移:

Enable-Migration
Add-Migration "NewMigration"
Update-Database

但是在启用迁移时我得到了提及的错误。 有人知道我做错了什么吗?

编辑:

这是Web.config文件中的connectionString

 <connectionStrings>
    <add name="PostContext" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-StudentBookApp-20150114035149.mdf;Initial Catalog=aspnet-StudentBookApp-20150114035149;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

4 个答案:

答案 0 :(得分:21)

我非常确定您的实体配置问题。

HasOptional()HasRequired()的调用用于指定关系约束。你想要做的是设置属性约束:

Property(c => c.PostText).IsRequired();

请注意,拨打ToTable()一次就足够了!

以下是对此的一些解读: Configuring/Mapping Properties and Types with the Fluent API

您也可以使用注释属性获得相同的结果:

public class Post
{
    [Key]
    public int PostId { get; set; }

    [Required]
    public string PostText { get; set; }
    public byte[] ImagePost { get; set; }
    public byte[] FilePost { get; set; }
    public string TextPost { get; set; }

    [Required]
    public string UserId { get; set; }
}

以下是对此的一些解读: Code First Data Annotations

编辑:

我刚看到你想用表来存储二进制数据(两个byte []属性)。我并不是真的建议这样做,并且经常将文件存储在磁盘上更好(例如,更容易实现基于路径的缓存)。如果你想坚持这一点,你仍然可以阅读这个问题:MVC Model How to make byte[] nullable?

答案 1 :(得分:1)

我在流畅的API中遇到了类似的情况

这会导致错误。

modelBuilder.Entity<QualityRating>()
    .HasRequired(x => x.RatedOnUserID)
    .WithMany()
    .HasForeignKey(x => x.ApplicationUser);

我改为

modelBuilder.Entity<QualityRating>()
    .HasRequired(x => x.ApplicationUser)
    .WithMany()
    .HasForeignKey(x => x.RatedOnUserID);

身份证被解雇了。

答案 2 :(得分:0)

消息的第二部分:“验证它是否未从模型中明确排除,并且它是有效的导航属性” - 检查是否有人(或您)在忽略方法中意外忽略该模型。

private void Ignore(DbModelBuilder modelBuilder)
{
     modelBuilder.Ignore<SomeModel>();
}

答案 3 :(得分:0)

签入您的类引用以将虚拟属性添加到该类。