1

我正在尝试为我的项目中的一些 Web 服务调用构建一些单元测试。我在我的项目中使用 Entity Framework 6.1.3 来检索服务层的数据(使用代码优先方法)。我做了一些关于如何模拟 DatabaseContext 对象的研究,我发现 Effort 可以做到这一点。

在我的单元测试中实现 Effort 时,我遵循了文档,但是当我尝试将数据播种到我的实体时,我得到一个“System.InvalidOperationException:'Sequence contains no matching element'”异常。我不完全确定为什么会这样。任何帮助都感激不尽。谢谢!

这是代码的样子......

  //THE CALLER -- Doing what Effort suggests to do.

    var dbConnection = DbConnectionFactory.CreateTransient();
        FakeDbContext = new FakeDbContext(dbConnection);
        DatabaseSeed.AddTestData(FakeDbContext);

这是我向实体播种数据的地方...

public static void AddTestData(IFakeDbContext context)
    {
        //**************** IT CRASHES HERE *********************
        context.FakeEntity1.AddOrUpdate(new FakeEntity1 
        {
           Name1 = "TestingName1",
           LastName1 = "TestingLastName1"

        });

        context.SaveChanges();
    }

这是我的实体模型...

[Table("rpt.FakeEntity1")]
public partial class FakeEntity1 : IFakeEntity1 
{
    [Key]
    [Column(Order = 0)]
    [StringLength(20)]
    public string Name1 { get; set; }

    [Key]
    [Column(Order = 1)]
    [StringLength(20)]
    public string LastName1 { get; set; }

}

这是我的数据库上下文...

public partial class FakeDbContext: IFakeDbContext
{

    public FakeDbContext(DbConnection dbConnection) 
                          : base(dbConnection, true)
    {
        //Effort requires this.
    }

}

public interface IFakeDbContext :IDisposable
{

    DbSet<FakeEntity1> FakeEntity1 {get; set;}

}

我还有另一个覆盖 OnModelCreating 的类 FakeDbContext.Base。

这是堆栈跟踪:

堆栈跟踪

4

2 回答 2

3

堆栈跟踪显示当数据提供者正在寻找“来自名称的存储类型”时引发了异常。这表明您正在使用 Effort 不支持的数据类型。Effort 项目中的一个问题证实了这一点。

于 2018-02-07T08:59:16.003 回答
0

希望这可以帮助。

许多答案说你必须FirstorDefault()在你的 EF 语句中添加,但是这个错误也发生在使用数据注释的不正确的属性中。

使用数据注释时,请注意添加的属性。

下面的示例,我错过了TypeName = "string",它应该nvarchar是数据库中的数据类型。

另外,请注意Order = n,(以 0 开头)

在更新过去的同事源代码时遇到了这个问题。

[Display(Name = "Name")]
[MaxLength(4000)]
[Column("Name", Order = 14, TypeName = "string")]
public string Name { get; set; }

然后我更正了我的代码

[Display(Name = "Name")]
[MaxLength(4000)]
[Column("Name", Order = 15, TypeName = "nvarchar")]
public string Name { get; set; }

:)

于 2017-11-16T13:22:06.560 回答