我尝试新表添加到现有的数据库中。该数据库由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>
我敢肯定的是,在问题的实体配置。
该呼叫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?
类似的情况发生,我用流利的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被切换。
该消息的第二部分:“确认尚未明确从模型中排除,这是一个有效的导航属性” - 检查是否有人(或你)不小心忽略忽略方法模型。
private void Ignore(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<SomeModel>();
}
检查你的类参考把虚拟属性的类。