我试图将新表添加到现有数据库中。该数据库由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>
答案 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)
签入您的类引用以将虚拟属性添加到该类。