2017-05-10 3 views
0

私は、Entity Framework DBコンテキストで返答するいくつかのクラスでユニットテストをしようとしています。助けを求めて、私はEffortと呼ばれるライブラリを見つけることができました。これは少し古くてよく書かれていないようですが、うまくいくと思われ、かなり普及しているようです。エラー(EFユニットテスト)エラーを与える

私はCSVデータローダーを使用しようとしています。

ToArray()の場合は、Sequence contains no matching elementという例外が表示されます。

私が間違っていると思われることについてのアイデアはありますか?あるいは別のライブラリではない場合は、チャンスを与えたいかもしれませんか?

抜粋:

[Table("SEC_USER")] 
public class SecUser { 
    [Key][Column("USERID")] 
    public int UserId { get; set; } 

    [Column("USERNAME")] 
    public string UserName { get; set; } 
} 

DBコンテキスト:

public class MusketeerDbContext : DbContext 
{ 
    public virtual IDbSet<IbsCommunity> Communities { get; set; } 
    public virtual IDbSet<IbsFunctionLinkLocation> Functionlinklocations { get; set; } 
    public virtual IDbSet<IbsInstance> Instances { get; set; } 
    public virtual IDbSet<SecUser> Users { get; set; } 
    public virtual IDbSet<IbsFieldType> FieldTypes { get; set; } 
    public virtual IDbSet<IbsLink> Links { get; set; } 
    public virtual IDbSet<IbsFieldFll> FieldFlls { get; set; } 
    public virtual IDbSet<IbsFieldValue> FieldValues { get; set; } 

    public MusketeerDbContext() : base("name=EGS.My.MySettings.Conn") { } 
    public MusketeerDbContext(DbConnection connection) : base(connection, true) { } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("SA"); 
     modelBuilder.Conventions.Add(new FunctionConvention(typeof(OracleFunctions))); 

     modelBuilder.Entity<IbsFieldValue>() 
      .HasMany(fv => fv.InstancesFieldValues) 
      .WithMany(i => i.InstancesFieldValues) 
      .Map(mm => 
      { 
       mm.MapLeftKey("FIELDVALUEID"); 
       mm.MapRightKey("INSTANCEID"); 
       mm.ToTable("IBS_INSTANCEFIELDVALUE"); 
      }); 
    } 
} 

public static class OracleFunctions 
{ 
    [Function(FunctionType.BuiltInFunction, "TO_CHAR")] 
    public static string ToChar(this int value) => Function.CallNotSupported<string>(); 

    [Function(FunctionType.BuiltInFunction, "TO_NCHAR")] 
    public static string ToChar(this string value) => Function.CallNotSupported<string>(); 
} 

SEC_USER.csv:

USERID,USERNAME 
"1","Jonathan" 

試験:

var path = @"C:\...\CSVs"; 
var dataLoader = new Effort.DataLoaders.CsvDataLoader(path); 
var context = Effort.DbConnectionFactory.CreateTransient(dataLoader); 
db = new MusketeerDbContext(context); 
var users = db.Users.ToArray(); 

のSystem.InvalidOperationException:

Message: "Sequence contains no matching element" 
InnerException: null 
StackTrace: 
    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate) 
    at System.Data.Entity.Utilities.DbProviderManifestExtensions.GetStoreTypeFromName(DbProviderManifest providerManifest, String name) 
    at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.ConfigureColumn(EdmProperty column, EntityType table, DbProviderManifest providerManifest) 
    at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(EdmProperty column, EntityType table, DbProviderManifest providerManifest, Boolean allowOverride, Boolean fillFromExistingConfiguration) 
    at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.<>c__DisplayClass4.<Configure>b__3(Tuple`2 pm) 
    at System.Data.Entity.Utilities.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action) 
    at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(IEnumerable`1 propertyMappings, DbProviderManifest providerManifest, Boolean allowOverride, Boolean fillFromExistingConfiguration) 
    at System.Data.Entity.ModelConfiguration.Configuration.Types.StructuralTypeConfiguration.ConfigurePropertyMappings(IList`1 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, ICollection`1 entitySets, 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 input) 
    at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() 
    at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
    at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
    at System.Data.Entity.Internal.Linq.InternalSet`1.GetEnumerator() 
    at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
    at Igs.Musketeer.DbRepository.Tests.SecurityRepositoryTest..ctor() in C:\Users\me\Source\Repos\Musketeer\Igs.Musketeer.DbRepositoryTests\SecurityRepositoryTest.cs:line 21 
+0

はあなたがここに例外スタックトレースを投稿してもらえますか?フレームワークメソッドで例外がスローされたと思われます。 –

+0

スタックトレースが追加されました。 – JonathanPeel

+0

問題は 'MusketeerDbContext'が設定されているようですが、あなたはそのクラスの定義を投稿できますか? –

答えて

1

私はこの問題を持っていたと私は問題を発見し、私はColumnTypeデータアノテーションを使用していたということでした。私がHasColumnTypeのモデルビルダーの規約を使用するように変更したとしても、まったく同じエラーが発生しました。あなたのエンティティの1つがそのデータ注釈(または規約)を持っていると思いますか?

この場合、データアノテーションを削除するのが最も簡単な方法です。可能であれば、DbContextの仮想プロパティ(など)をテストでオーバーライドしました。public override bool IsInMemoryContext { get; } = true;OnModelCreatingメソッドでは、このプロパティが設定されているかどうかを確認してから、列の種類を追加しました。エラーの

if (!IsInMemoryContext) 
{ 
    modelBuilder.Entity<AuditLog>() 
     .Property(e => e.EventType) 
     .HasColumnType("char"); 
} 

詳しい情報はここで見つけることができます:GitHub issue with Effort

関連する問題