导航属性不是代码首先迁移与EF6和MVC 5期间类型声明的属性

问题描述 投票:5回答:4

我尝试新表添加到现有的数据库中。该数据库由MVC 5项目自动创建。尝试很多不同的东西后,我并没有追加表后到我的数据库成功。

当我运行:

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

我得到一个错误说:导航属性“PostText”不在类型“邮报”声明的属性。验证它尚未明确从模型中排除,这是一个有效的导航属性。

我不明白这个错误,bacause 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>
c# asp.net-mvc asp.net-mvc-5 entity-framework-6 ef-migrations
4个回答
22
投票

我敢肯定的是,在问题的实体配置。

该呼叫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

编辑:

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


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);

该ID被切换。


0
投票

该消息的第二部分:“确认尚未明确从模型中排除,这是一个有效的导航属性” - 检查是否有人(或你)不小心忽略忽略方法模型。

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

0
投票

检查你的类参考把虚拟属性的类。

© www.soinside.com 2019 - 2024. All rights reserved.