【问题标题】:Error initializing entity framework database sequence contains no matching elements初始化实体框架数据库序列时出错,不包含匹配元素
【发布时间】:2015-03-22 15:24:58
【问题描述】:

在过去的 5 个小时里我一直盯着这个看,尝试了很多东西,但我没有得到任何结果......

当我尝试启动我使用 Entity Framework Code First 创建的数据库的 MVC 网站时,数据库无法初始化,抛出以下异常消息:

序列不包含匹配元素

下面堆栈跟踪的第一行执行一个 Linq .Single 查询,所以我的印象是它在我的模型中寻找一个不存在的项目。如果这是正确的,我如何找出该项目是什么?

此外,我已经束手无策,因此决定在抛出异常后绝对检查所有调试信息,我在 Autos 窗口中注意到以下内容:

这是直接引用我的 OnModelCreating 覆盖:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new CompanyDBConfiguration());
        modelBuilder.Configurations.Add(new ClientDBConfiguration());
        modelBuilder.Configurations.Add(new QuoteDBConfiguration());
        modelBuilder.Configurations.Add(new RoleDBConfiguration());
        modelBuilder.Configurations.Add(new UserDBConfiguration());
        modelBuilder.Configurations.Add(new InvoiceDBConfiguration());
        modelBuilder.Configurations.Add(new JobDBConfiguration());
        modelBuilder.Configurations.Add(new JobStatusDBConfiguration());            
    }

非常感谢任何可以用来让我更接近解决方案的信息。

很抱歉,如果这里没有足够的信息,我不知道该提供什么。这是堆栈跟踪:(向下滚动进行编辑)

System.InvalidOperationException 未被用户代码处理
HResult=-2146233079
Message=Sequence 不包含匹配元素
来源=System.Core
堆栈跟踪:
在 System.Linq.Enumerable.Single[TSource](IEnumerable1 source, Func2 谓词)
在 System.Data.Entity.Utilities.DbProviderManifestExtensions.GetStoreTypeFromName(DbProviderManifest providerManifest,字符串名称)
在 System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(EdmProperty 列,EntityType 表,DbProviderManifest providerManifest,布尔 allowOverride,布尔 fillFromExistingConfiguration)
在 System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.c__DisplayClass1.b__0(Tuple2 pm) at System.Data.Entity.Utilities.IEnumerableExtensions.Each[T](IEnumerable1 ts, Action1 action)
at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(IEnumerable
1 propertyMappings, DbProviderManifest providerManifest, Boolean allowOverride, Boolean fillFromExistingConfiguration)
在 System.Data.Entity.ModelConfiguration.Configuration.Types.StructuralTypeConfiguration.ConfigurePropertyMappings(IList1 propertyMappings, DbProviderManifest providerManifest, Boolean allowOverride)
at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.ConfigurePropertyMappings(DbDatabaseMapping databaseMapping, EntityType entityType, DbProviderManifest providerManifest, Boolean allowOverride)
at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.Configure(EntityType entityType, DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.ConfigureEntityTypes(DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.Configure(DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
at System.Data.Entity.Internal.RetryLazy
2.GetValue(TInput 输入)
在 System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
在 System.Data.Entity.Internal.LazyInternalContext.MarkDatabaseInitialized()
在 System.Data.Entity.Database.Initialize(布尔力)
在 e:\Development\Jobber\Jobber.Web\Global.asax.cs:line 28 中的 Jobber.Web.MvcApplication.Application_Start()
内部异常:

编辑 1

这是 Global.asax 的代码

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        WebDBContext db = new WebDBContext();
        db.Database.Initialize(true);
        db.Seed();
    }
}

这里是WebDBContext()

// BaseDBContext is a generic class that inherits from DbContext, see it's code below
public class WebDBContext : BaseDBContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new CompanyDBContext());
        modelBuilder.Configurations.Add(new ClientDBContext());
        modelBuilder.Configurations.Add(new QuoteDBContext());
        modelBuilder.Configurations.Add(new RoleDBContext());
        modelBuilder.Configurations.Add(new UserDBContext());
        modelBuilder.Configurations.Add(new InvoiceDBContext());
        modelBuilder.Configurations.Add(new JobDBContext());
        modelBuilder.Configurations.Add(new JobStatusDBContext());            
    }

    public WebDBContext()
    {
        Database.SetInitializer<WebDBContext>(new DropCreateDatabaseAlways<WebDBContext>());
    }

    public void Seed()
    {
        // seeds initial data into the database
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<Client> Clients { get; set; }
    public DbSet<Company> Companies { get; set; }
    public DbSet<Invoice> Invoices { get; set; }
    public DbSet<Job> Jobs { get; set; }
    public DbSet<JobStatus> JobStatuses { get; set; }
    public DbSet<Quote> Quotes { get; set; }

BaseDBContext:
这个类只提供了一个通用上下文,它并不特定于任何应用程序。这允许为项目之间可能共有的对象编写 CRUD 功能

public class BaseDBContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new BaseUserDBContext());
    }

    public BaseDBContext()
        : base()
    {
        Database.SetInitializer<BaseDBContext>(new DropCreateDatabaseIfModelChanges<BaseDBContext>());
    }

    public DbSet<BaseUser> Users { get; set; }
}

编辑 2
Chris 请求了 ConnectionString 和 My UserDBContext(下面有更多关于这个 - 非常重要的东西

  <connectionStrings>
    <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-Jobber.Web-20150105094927;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-Jobber.Web-20150105094927.mdf" />
  </connectionStrings>

public class UserDBContext : DBBaseObject<User>
{
    // application-specific columns
    public UserDBContext()
        : base()
    {
        //HasOptional(r => r.Role)
        //    .WithMany(m => m.Users)
        //   .Map(x => x.MapKey("fkRoleID"))
        //    .WillCascadeOnDelete(false);

        ToTable("Users");
    }
}

首先要解释这一点...我正在开发一个应用程序框架来处理所有“全球通用”的结构和方法,也就是说,它可以处理逻辑上认为在应用程序之间通用的所有事情。

例如包含用户名和密码的用户对象。

该框架与许多继承、抽象类和一些泛型的使用组合在一起。这或多或少是没有这些的样子:

框架:

Logan.Base
{
    Logan.Base.BaseObject  
    - defines common fields that all tables will always have (PK, auditing, etc)  

    Logan.Base.BaseUser  
    - defines common fields that user tables will have (username, password, etc)
}  
Logan.DBBase  
{
    Logan.DBBase.BaseUserDBContext  
    - defines C#->SQL data type mappings for the BaseUser along with CRUD functions  

    Logan.DBBase.DBBaseObject  
    - defines C#->SQL data type mappings for columns that all tables will always have  

    Logan.DBBase.DBContext  
    - defines a DbContext to be used in the DBBaseObject
}

Logan.Base

namespace Logan.Base
{
    public abstract class BaseObject
    {
        public Int64 PKey { get; set; }
        public Int64 CreatedBy { get; set; }
        public DateTime CreatedOn { get; set; }
        public Int64 ModifiedBy { get; set; }
        public DateTime ModifiedOn { get; set; }

        public BaseObject()
        {
            PKey = 0;
            CreatedBy = 0;
            ModifiedBy = 0;
        }
    }

    public abstract class BaseUser : BaseObject
    {
        public string EmailAddress { get; set; }
        public string Password { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public BaseUser()
        {
            EmailAddress = String.Empty;
            Password = String.Empty;
            FirstName = String.Empty;
            LastName = String.Empty;
        }        
    }
}

Logan.DBBase

namespace Logan.DBBase
{

    public abstract class DBBaseObject<T> : EntityTypeConfiguration<T>
        where T : BaseObject
    {

        public DBBaseObject()
            : base()
        {
            HasKey(p => p.PKey);
        }
    }

    public class BaseUserDBContext : DBBaseObject<BaseUser>
    {

        // common columns
        public BaseUserDBContext()
            : base()
        {
            Property(p => p.EmailAddress)
                .HasColumnName("sEmailAddress")
                .HasMaxLength(200)
                .IsRequired();

            Property(p => p.Password)
                .HasColumnName("sPassword")
                .HasMaxLength(255)
                .IsRequired();

            Property(p => p.FirstName)
                .HasColumnName("sFirstName")
                .IsRequired();

            Property(p => p.LastName)
                .HasColumnName("sLastName")
                .IsRequired();

            ToTable("Users");
        }

        // User CRUD functions that use the below DbContext go here
    }

    public class BaseDBContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Configurations.Add(new BaseUserDBContext());
        }

        public BaseDBContext()
            : base()
        {
            Database.SetInitializer<BaseDBContext>(new DropCreateDatabaseIfModelChanges<BaseDBContext>());
        }

        public DbSet<BaseUser> Users { get; set; }
    }
}

【问题讨论】:

  • 好吧,知道 e:\Development\Jobber\Jobber.Web\Global.asax.cs:line 28 的内容及其周围的代码可能会有所帮助...
  • @simonatrcl 果然我可以发布 Global.asax 代码...你还需要什么?
  • 可能还需要查看您的上下文初始化程序。
  • 我知道这是旧帖子,我希望您已经解决了您的问题。但是,如果没有,看看这个答案stackoverflow.com/a/26156805/1380428
  • @AdilMammadov,没错!谁遇到了这个奇怪的错误,请检查您的属性,特别是应该为 nvarchar 指定多少长度。链接中的详细信息。

标签: c# linq entity-framework ef-code-first


【解决方案1】:

对我来说,问题是我的表中有一个 SQL_VARIANT 类型的列。一旦我将其更改为 nvarchar,错误就消失了。

【讨论】:

    【解决方案2】:

    我认为您的DBContext 有几个问题。我会回到基础,一旦我得到数据库初始化工作,我就会开始添加东西。因此,首先,删除 BaseDbContext 并将您的 WebDBContext 更改为:

    public class WebDBContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Configurations.Add(new CompanyDBContext());
            modelBuilder.Configurations.Add(new ClientDBContext());
            modelBuilder.Configurations.Add(new QuoteDBContext());
            modelBuilder.Configurations.Add(new RoleDBContext());
            modelBuilder.Configurations.Add(new UserDBContext());
            modelBuilder.Configurations.Add(new InvoiceDBContext());
            modelBuilder.Configurations.Add(new JobDBContext());
            modelBuilder.Configurations.Add(new JobStatusDBContext());            
        }
    
        public DbSet<User> Users { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<Client> Clients { get; set; }
        public DbSet<Company> Companies { get; set; }
        public DbSet<Invoice> Invoices { get; set; }
        public DbSet<Job> Jobs { get; set; }
        public DbSet<JobStatus> JobStatuses { get; set; }
        public DbSet<Quote> Quotes { get; set; }
    }  
    

    婴儿步。让它工作,然后我们可以添加其余的配置,如果仍然需要的话

    【讨论】:

    • 好的,除了您在此处显示的内容之外,我已经注释掉了所有内容,并且我已经摆脱了 BaseDBContext 以支持 DbContext 并且没有任何改变。有趣的是,之前已经完成了这一步,这一步不会改变以任何方式实际执行的代码
    • 您的 UserDbContext 在哪里?我没有看到这个:modelBuilder.Configurations.Add(new UserDBContext());
    • 都已添加到Edit 2下
    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多