gpt4 book ai didi

c# - 我在 EF Core Code First 方法中使用 AutoFixture 时遇到异常 "AutoFixture.ObjectCreationExceptionWithPath"

转载 作者:行者123 更新时间:2023-12-05 04:48:46 29 4
gpt4 key购买 nike

我目前正在使用 EF Core Code First Approach,并且我有以下域类:

public class Employee
{
// several properties such as Name, Address, ...

public Guid? CompanyId { get; set; }

public Company Company {get;set;}

}

public class Company
{
public Guid? CompanyId { get; set; }

public IEnumerable<Employee>? Employee{ get; set; }
}

我正在使用 XUnit 和 Autofixture 来创建我的测试:

public class MyTest{

private readonly Fixture _fixture = new Fixture();

[Fact]
public void TestMethod(){

var employee = _fixture.Create<Employee>();
...
}

}

上面的 _fixture.Create 给我以下错误:

Message: AutoFixture.ObjectCreationExceptionWithPath : AutoFixture was unable to create an instance of type AutoFixture.Kernel.FiniteSequenceRequest because the traversed object graph contains a circular reference.

我需要在 Employee 类中包含:public Company Company {get;set;} 以使其成为外键。但是,如果我删除该行,它就可以正常工作。

许多在线链接建议使用以下解决方案 - 但我想知道是否有其他解决方法而不是删除 ThrowingRecursion 行为:

fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList()
.ForEach(b => fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());

最佳答案

这可能不是您问题的直接答案如何使用 AutoFixture...有许多可能的选项:

  1. 您可以按照问题中的建议自定义 AF
  2. 您可以配置 EF Core 外键 without using navigation property
  3. 或者,您可以将代码设计更改为更 DDD 风格。这可能会帮助您避免任何 AF 自定义,但也可能会更耗时......

让您的代码更“DDD-ish”的第一步是关闭公共(public) setter 并开始通过构造函数或方法参数管理您的实体。这将使 AF 创建您的类而无需循环依赖。 EF Core 也足够聪明,能够将值设置到 protected 成员中。代码可能如下所示:

public class Employee
{
// closed setter, no AF issues, EF Core will still work
public Company Company {get; protected set;}

// Some functionality from your domain model
public void JoinCompany(Company company)
{
// do smth here.
Company = company
}

public void LeaveCompany()
{
Company = null;
}
}

或者,从公司的角度来看,API 可能如下所示(同样,我不知道您的领域模型,所以只是原型(prototype)设计):

public class Company
{
private List<Employee> _employee = new List<Employee>();

public IReadOnlyCollection<Employee> Employee => _employee;

public void EnrollEmployee(Employee employee)
{
_employee.Add(employee);
}
}

一些代码示例可以在这里找到:https://github.com/vkhorikov/DddAndEFCore/blob/master/src/App/Student.cs

关于c# - 我在 EF Core Code First 方法中使用 AutoFixture 时遇到异常 "AutoFixture.ObjectCreationExceptionWithPath",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67903647/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com