如何使用 EF Core 6 在 xUnit 测试中为多对多关系正确播种数据

问题描述 投票:0回答:0

我有 ApiKey 实体

public class ApiKey : BaseEntity {
    [StringLength(255)]
    [Column("ApiKey")]
    public string ApiKeyValue { get; set; } = string.Empty;

    public ICollection<LoyaltyProgram> LoyaltyPrograms { get; set; } = new HashSet<LoyaltyProgram>(); 
}

我还有 LoyaltyProgram 实体:

public class LoyaltyProgram : BaseEntity
{
    [StringLength(50)]
    public string Name { get; set; } = string.Empty;

    public ICollection<ApiKey> ApiKeys { get; set; } = new HashSet<ApiKey>();
}

我想创建多对多关系。根据官方文档,我不需要再添加任何配置: https://learn.microsoft.com/en-us/ef/core/modeling/relationships/many-to-many#basic-many-to-many

当我开始我的 xUnit 测试时,我收到此错误消息:

System.InvalidOperationException : 实体类型的种子实体 无法添加具有键值“Id:1”的“ApiKey”,因为它具有 导航“忠诚度计划”集。要播种关系,请添加 实体种子到“ApiKeyLoyaltyProgram(Dictionary)”和 指定外键值 {'ApiKeysId'}。

这就是我的 xUnit 测试的样子:

[Fact]
    public async Task GivenPostMeasurementCommand_WhenDeviceIsSendingMeasurementData_ThenResponseIsReturned()
    {
        var context = CreateContext();

        var loyaltyProgram_1 = CreateLoyaltyProgram();

        var customer_1 = CreateCustomer();
        customer_1.FirstName = "FirstName";
        customer_1.LastName = "LastName";

        var loyaltyProgramCustomer_1 = CreateLoyaltyProgramCustomer();
        loyaltyProgramCustomer_1.LoyaltyProgram = loyaltyProgram_1;
        loyaltyProgramCustomer_1.Customer = customer_1;

        var product_1 = CreateProduct();
        product_1.LoyaltyProgram = loyaltyProgram_1;

        var productRule_1 = CreateProductRule();
        ...

        var customerCard_1 = CreateCustomerCard();
        ...

        var session_1 = CreateSession();
        ...

        var apiKey_1 = CreateApiKey();
        apiKey_1.ApiKeyValue = "api key";
        apiKey_1.LoyaltyPrograms = new List<LoyaltyProgram>() { loyaltyProgram_1 };

        loyaltyProgram_1.ApiKeys.Add(apiKey_1);

        await context.Sessions.AddAsync(session_1);
        await context.ProductRules.AddAsync(productRule_1);
        await context.LoyaltyProgramCustomers.AddAsync(loyaltyProgramCustomer_1);
        await context.ApiKeys.AddAsync(apiKey_1);

        await context.SaveChangesAsync();

        ...
    }

它在第一个 AddAsync 方法上中断,或者在这种情况下

await context.Sessions.AddAsync(session_1);

如何在多对多关系中正确播种数据?

c# asp.net entity-framework many-to-many xunit
© www.soinside.com 2019 - 2024. All rights reserved.