Entity framework Upstate Database命令期间出现重复记录问题

Entity framework Upstate Database命令期间出现重复记录问题,entity-framework,c#-4.0,ef-code-first,entity-framework-migrations,Entity Framework,C# 4.0,Ef Code First,Entity Framework Migrations,这个问题涉及: 然而,我有一个不同的问题。我将重复字段添加到单独的记录中,如以下代码所示: context.UnitOfMeasureDefaultBaseUnits.AddOrUpdate(x => x.Name, new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Pound", Active = true, Abbreviation = "lb", DisplayOrder = 1, UnitOfMeasureTypeID

这个问题涉及:

然而,我有一个不同的问题。我将重复字段添加到单独的记录中,如以下代码所示:

context.UnitOfMeasureDefaultBaseUnits.AddOrUpdate(x => x.Name,
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Pound", Active = true, Abbreviation = "lb", DisplayOrder = 1, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Ounce", Active = true, Abbreviation = "oz", DisplayOrder = 2, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Ton", Active = true, Abbreviation = "ton", DisplayOrder = 3, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Gram", Active = true, Abbreviation = "g", DisplayOrder = 4, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Kilogram", Active = true, Abbreviation = "kg", DisplayOrder = 5, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Metric Ton", Active = true, Abbreviation = "t", DisplayOrder = 6, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Other", Active = true, Abbreviation = "", DisplayOrder = 7, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Hour", Active = true, Abbreviation = "hr", DisplayOrder = 1, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Time")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Minute", Active = true, Abbreviation = "min", DisplayOrder = 2, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Time")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Day", Active = true, Abbreviation = "day", DisplayOrder = 3, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Time")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Work Day", Active = true, Abbreviation = "wrkday", DisplayOrder = 4, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Time")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Other", Active = true, Abbreviation = "", DisplayOrder = 5, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Time")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Gallon", Active = true, Abbreviation = "gal", DisplayOrder = 1, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Volume")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Fluid Ounce", Active = true, Abbreviation = "floz", DisplayOrder = 2, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Volume")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Quart", Active = true, Abbreviation = "qt", DisplayOrder = 3, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Volume")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Liter", Active = true, Abbreviation = "l", DisplayOrder = 4, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Volume")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Cubic Inch", Active = true, Abbreviation = "cuin", DisplayOrder = 5, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Volume")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Cubic Centimeter", Active = true, Abbreviation = "cucm", DisplayOrder = 6, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Volume")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Other", Active = true, Abbreviation = "", DisplayOrder = 7, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Volume")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Foot", Active = true, Abbreviation = "ft", DisplayOrder = 1, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Length")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Inch", Active = true, Abbreviation = "in", DisplayOrder = 2, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Length")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Yard", Active = true, Abbreviation = "yd", DisplayOrder = 3, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Length")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Mile", Active = true, Abbreviation = "mi", DisplayOrder = 4, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Length")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Millimeter", Active = true, Abbreviation = "mm", DisplayOrder = 5, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Length")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Meter", Active = true, Abbreviation = "m", DisplayOrder = 6, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Length")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Other", Active = true, Abbreviation = "", DisplayOrder = 7, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Length")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Square Foot", Active = true, Abbreviation = "sqft", DisplayOrder = 1, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Area")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Square Inch", Active = true, Abbreviation = "sqin", DisplayOrder = 2, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Area")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Square Yard", Active = true, Abbreviation = "sqyd", DisplayOrder = 3, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Area")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Square Meter", Active = true, Abbreviation = "sqm", DisplayOrder = 4, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Area")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Other", Active = true, Abbreviation = "", DisplayOrder = 5, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Area")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Each", Active = true, Abbreviation = "ea", DisplayOrder = 1, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Count")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Pair", Active = true, Abbreviation = "pr", DisplayOrder = 2, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Count")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Dozen", Active = true, Abbreviation = "dz", DisplayOrder = 3, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Count")).RecordID },
    new UnitOfMeasureDefaultBaseUnitsModel() { Name = "Other", Active = true, Abbreviation = "", DisplayOrder = 4, UnitOfMeasureTypeID = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Count")).RecordID }
);
updatedatabase
命令正在发出,因为“Other”被多次使用,并出现以下错误:

System.InvalidOperationException: Sequence contains more than one element
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
   at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__2[TResult](IEnumerable`1 sequence)
   at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
   at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
   at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
   at System.Data.Entity.Migrations.DbSetMigrationsExtensions.AddOrUpdate[TEntity](DbSet`1 set, IEnumerable`1 identifyingProperties, InternalSet`1 internalSet, TEntity[] entities)
   at System.Data.Entity.Migrations.DbSetMigrationsExtensions.AddOrUpdate[TEntity](IDbSet`1 set, Expression`1 identifierExpression, TEntity[] entities)
   at Model.Migrations.Configuration.Seed(ApplicationDbContext context) in Z:\_Profile Storage\Projects\Corporate.Web.MVCAPI\Corporate.Web.MVCAPI\Model\Migrations\Configuration.cs:line 6744
   at System.Data.Entity.Migrations.DbMigrationsConfiguration`1.OnSeed(DbContext context)
   at System.Data.Entity.Migrations.DbMigrator.SeedDatabase()
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase()
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
Sequence contains more than one element
System.InvalidOperationException:序列包含多个元素
在System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)处
位于System.Data.Entity.Core.Objects.elink.ObjectQueryProvider.b__2[TResult](IEnumerable`1序列)
位于System.Data.Entity.Core.Objects.Elink.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1查询,表达式queryRoot)
位于System.Data.Entity.Core.Objects.Elink.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](表达式)
在System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](表达式)处
位于System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1源,表达式`1谓词)
位于System.Data.Entity.Migrations.DbSetMigrationsExtensions.AddOrUpdate[TEntity](DbSet`1集合,IEnumerable`1识别属性,InternalSet`1 InternalSet,TEntity[]实体)
位于System.Data.Entity.Migrations.DbSetMigrationsExtensions.AddOrUpdate[TEntity](IDbSet`1集,表达式`1 identifierExpression,TEntity[]entities)
在Z:\\ u Profile Storage\Projects\Corporate.Web.MVCAPI\Corporate.Web.MVCAPI\Model\Migrations\Configuration.cs中的Model.Migrations.Configuration.Seed(ApplicationDbContext上下文)处:第6744行
在System.Data.Entity.Migrations.DbMigrationsConfiguration`1.OnSeed(DbContext上下文)中
位于System.Data.Entity.Migrations.DbMigrator.SeedDatabase()处
位于System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase()处
位于System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations,String targetMigrationId,String lastMigrationId)
位于System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
位于System.Data.Entity.Migrations.Dbmigator.UpdateInternal(字符串targetMigration)
在System.Data.Entity.Migrations.DbMigrator.c__DisplayClassc.b__b()中
位于System.Data.Entity.Migrations.Dbmigator.EnsureDatabaseExists(操作必须成功才能访问数据库)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作必须成功才能使用数据库)
位于System.Data.Entity.Migrations.DbMigrator.Update(字符串targetMigration)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串targetMigration)
在System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()中
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
位于System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner)
位于System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串targetMigration,布尔力)
在System.Data.Entity.Migrations.UpdateDatabaseCommand.c__DisplayClass2.b__0()中
位于System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作命令)
序列包含多个元素

是否有解决此问题的方法?它是什么?

第一个参数告诉addor更新密钥。您正在使用名称,因此其他名称不能被多次使用。把它换成独一无二的东西。也许x=>x.UnitOfMeasureTypeID?否则,请放弃AddOrUpdate语法并使用常规LINQ:

var weightUnitTypeId = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID;

if (!context.UnitOfMeasureDefaultBaseUnits.Any(u => u.UnitOfMeasureTypeID == weightUnitTypeId && u.Name == "Pound"))
{
     // insert new record
     var pound = new UnitOfMeasureDefaultBaseUnitsModel { Name = "Pound", Active = true, Abbreviation = "lb", DisplayOrder = 1, UnitOfMeasureTypeID = weightUnitTypeId };
     context.UnitOfMeasureDefaultBaseUnits.Add(pound);
}
// repeat for Ounce, Ton, etc.


var timeUnitTypeId = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Time")).RecordID;

if (!context.UnitOfMeasureDefaultBaseUnits.Any(u => u.UnitOfMeasureTypeID == timeUnitTypeId && u.Name == "hr"))
{
     // insert new record
     var time = new UnitOfMeasureDefaultBaseUnitsModel { Name = "hr", Active = true, Abbreviation = "hr", DisplayOrder = 1, UnitOfMeasureTypeID = weightUnitTypeId };
     context.UnitOfMeasureDefaultBaseUnits.Add(time);
}
// repeat for all time units

...
// similar for other units
...
context.SaveChanges();

第一个参数告诉addor更新密钥。您正在使用名称,因此其他名称不能被多次使用。把它换成独一无二的东西。也许x=>x.UnitOfMeasureTypeID?否则,请放弃AddOrUpdate语法并使用常规LINQ:

var weightUnitTypeId = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Weight")).RecordID;

if (!context.UnitOfMeasureDefaultBaseUnits.Any(u => u.UnitOfMeasureTypeID == weightUnitTypeId && u.Name == "Pound"))
{
     // insert new record
     var pound = new UnitOfMeasureDefaultBaseUnitsModel { Name = "Pound", Active = true, Abbreviation = "lb", DisplayOrder = 1, UnitOfMeasureTypeID = weightUnitTypeId };
     context.UnitOfMeasureDefaultBaseUnits.Add(pound);
}
// repeat for Ounce, Ton, etc.


var timeUnitTypeId = context.UnitOfMeasureDefaultType.FirstOrDefault(r => r.Name.Equals("Time")).RecordID;

if (!context.UnitOfMeasureDefaultBaseUnits.Any(u => u.UnitOfMeasureTypeID == timeUnitTypeId && u.Name == "hr"))
{
     // insert new record
     var time = new UnitOfMeasureDefaultBaseUnitsModel { Name = "hr", Active = true, Abbreviation = "hr", DisplayOrder = 1, UnitOfMeasureTypeID = weightUnitTypeId };
     context.UnitOfMeasureDefaultBaseUnits.Add(time);
}
// repeat for all time units

...
// similar for other units
...
context.SaveChanges();

有没有办法检查两个键而不是一个键?是的,x=>new{x.part1,x.part2}现在我得到了这个
没有为类型'System.Nullable'1[System.Guid]”和'System.Guid'定义二进制运算符Equal。
我想我必须对这部分种子进行老式的LINQ。这是否有效:
如果(!context.UnitOfMeasureDefaultBaseUnits.Any(u=>u.UnitOfMeasureTypeID.Equals(context.UnitOfMeasureDefaultType.FirstOrDefault(r=>r.Name.Equals(“Weight”).RecordID))&&!context.UnitOfMeasureDefaultBaseUnits.Any(u=>u.Name.Equals(“Pound”)){新的度量单位DefaultBaseUnitsModel(){=”Name=“Pound”,Active=true,缩写=“lb”,DisplayOrder=1,UnitOfMeasureTypeID=context.UnitOfMeasureDefaultType.FirstOrDefault(r=>r.Name.Equals(“Weight”)).RecordID};}
我编辑了答案。它可能更精简,但你会明白(希望如此)。有没有办法检查两个键而不是一个键?是的,x=>new{x.part1,x.part2}现在我得到了这个
没有为类型'System.Nullable'1[System.Guid]和'System.Guid'定义二进制运算符Equal。
我想我必须为这部分种子处理执行老式的LINQ。这是否有效:
如果(!context.UnitOfMeasureDefaultBaseUnits.Any(u=>u.UnitOfMeasureTypeID.Equals(context.UnitOfMeasureDefaultType.FirstOrDefault(r=>r.Name.Equals(“Weight”)).RecordID))&!context.UnitOfMeasureDefaultBaseUnits.Any(u=>u.Name.Equals(“Pound”){new UnitOfMeasureDefaultBaseUnitsModel(){Name=“Pound”,Active=true,缩写=“lb”,DisplayOrder=1,UnitOfMeasureTypeID=context.UnitOfMeasureDefaultType.FirstOrDefault(r=>r.Name.Equals(“Weight”).RecordID};}
我编辑了答案。它可能会更精简,但你会明白(希望如此)。