C# EF和现有数据库和表,以及一组新表
EF和现有数据库和表,以及一组新表 背景: 旧数据库具有新应用程序将使用的表用户。 我使用实体C# EF和现有数据库和表,以及一组新表,c#,entity-framework,C#,Entity Framework,EF和现有数据库和表,以及一组新表 背景: 旧数据库具有新应用程序将使用的表用户。 我使用实体DataModel向导来映射它 我现在所拥有的: 一组新实体及其配置: public class Bundle { public Bundle() { Produits = new HashSet<Produit>(); } public int BundleID { get; set; } public string Designation { get; set;
DataModel
向导来映射它
我现在所拥有的:
一组新实体及其配置:
public class Bundle
{
public Bundle() { Produits = new HashSet<Produit>(); }
public int BundleID { get; set; }
public string Designation { get; set; }
public ICollection<Produit> Produits { get; set; }
}
public class BundleConfiguration : EntityTypeConfiguration<Bundle>
{
public BundleConfiguration()
{
ToTable("PL_Bundle");
HasKey(e => e.BundleID);
Property(e => e.Designation).HasMaxLength(200);
}
}
在调用应用程序中,我试图测试数据库和表,以检查一切是否正常
static void Main(string[] args)
{
var db = new FooBarCore.DbContext.FooBarDbContext();
var all = db.User.ToList(); // Work
var bundles1 = db.Bundles.ToList();
前一行给我错误信息:
名称'objet'dbo.PL_Bundle'无效。=>无效的对象名称“dbo.PL\u Bundle”
我尝试的是:
modelBuilder.Configurations.Add(newbundleconfiguration())代码>。
或者直接在OnModelCreating
中使用fluent API会抛出相同的错误
EF not create table
,但CreateDatabaseIfNotExist
,DropCreateDatabaseWhenModelChanges
,DropCreateDatabaseAlways
都很可怕,它们的名字中都有这个Drop数据库
将DbContext类更新为:
public partial class FooBarDbContext : DbContext
{
public FooBarDbContext() : base("name=Model1")
=> Database.SetInitializer<FooBarDbContext>(null);
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Configurations for Bundle class
modelBuilder.Entity<Bundle>()
.ToTable("PL_Bundle")
.HasKey(e => e.BundleID);
.Property(e => e.Designation).HasMaxLength(200);
modelBuilder.ApplyAllConfigurations();
base.OnModelCreating(modelBuilder);
}
public DbSet<User> User { get; set; }
public DbSet<Bundle> Bundles { get; set; }
// [...]
}
public分部类FooBarDbContext:DbContext
{
public foobardContext():base(“name=Model1”)
=>数据库.SetInitializer(null);
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//Bundle类的配置
modelBuilder.Entity()
.ToTable(“PL_捆绑包”)
.HasKey(e=>e.BundleID);
.属性(e=>e.名称)。HasMaxLength(200);
modelBuilder.ApplyallConfiguration();
基于模型创建(modelBuilder);
}
公共数据库集用户{get;set;}
公共DbSet bundle{get;set;}
// [...]
}
因此,如评论中所述:
名称'objet'dbo.PL_Bundle'无效。=>无效的对象名
“dbo.PL_Bundle”
这意味着,EF认为应该有一个表PL_捆绑包,但实际上没有。它不存在,因为您在模型中添加了新类
为了让EF对数据库进行适当的更改,应该调用
您必须启用迁移、生成迁移并将其应用于数据库
好的做法是将迁移也存储为SQL脚本(通过使用UpdateDatabase-script),并让系统管理员手动应用它们,以防止在删除列或表时丢失任何机密数据
您随软件的新版本一起提供脚本,它应该崩溃,直到应用迁移,并在日志中说明需要哪个版本。如上所述:添加部分位于
modelBuilder.ApplyAllConfigurations()中
fluent处于EntityTypeConfiguration
中,这是我第一次尝试使用modelBuilder.Configurations.Add(newbundleconfiguration())
和您喜欢的fluent api。问题似乎更多地集中在初始值设定项部分。但是我的问题Database.SetInitializer(null)必须完整代码>表示不创建表,但其他选择是drop database或drop database。所以基本上你的数据库和你的模型是不同步的。是否创建了迁移?您是否运行了更新数据库
?在代码中应用迁移通常是个坏主意。最好是生成脚本并让人应用它们——他会知道这很严重,进行备份等。@KrzysztofSkowronek,我是一个简单的人,我从头到尾阅读了文档,最后的条目是:。使用正确的关键词,我找到了解决方案。是的,我有一个同步问题。我运行:启用迁移、添加迁移、更新数据库。但我手动编辑迁移,不删除或重新创建现有的表用户!你认为这个澄清值得你花时间和回答吗?
public partial class FooBarDbContext : DbContext
{
public FooBarDbContext() : base("name=Model1")
=> Database.SetInitializer<FooBarDbContext>(null);
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Configurations for Bundle class
modelBuilder.Entity<Bundle>()
.ToTable("PL_Bundle")
.HasKey(e => e.BundleID);
.Property(e => e.Designation).HasMaxLength(200);
modelBuilder.ApplyAllConfigurations();
base.OnModelCreating(modelBuilder);
}
public DbSet<User> User { get; set; }
public DbSet<Bundle> Bundles { get; set; }
// [...]
}