Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF和现有数据库和表,以及一组新表_C#_Entity Framework - Fatal编程技术网

C# 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;

EF和现有数据库和表,以及一组新表

背景: 旧数据库具有新应用程序将使用的表用户。 我使用实体
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”

我尝试的是:
  • 查找ModelBuilderExtensions是否是一个问题。但是使用经典的
    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; }
        // [...]
    }