我有一个数据库,它有两个不同的路径到某个实体,一个路径DeleteBehavior.Cascade和另一个路径,DeleteBehavior.Restrict以避免在数据库创建时出现多个级联路径错误。当在内存中使用 IIS Express 和 Visual Studio 的 SQL Server 在本地运行时,这正如我预期的那样工作,但在测试相同功能的单元测试中抛出错误。
例子:
public class Account
{
public string Id { get; set; }
}
每个帐户都可以订阅:
public class Subscription
{
public string Id { get; set; }
// relationships
public string AccountId { get; set; }
public Account Account { get; set; }
}
帐户和订阅都可以有联系人(这可能没有多大意义,但这只是一个例子,实际上我的模型更复杂,但基本上归结为这个):
public class Contact
{
public string Id { get; set; }
// relationships
public string AccountId { get; set; }
public Account Account { get; set; }
public string SubscriptionId { get; set; }
public Subscription Subscription { get; set; }
}
如果帐户或订阅被删除,我希望删除任何联系人。这是我的联系人模型构建器配置:
public void Configure(EntityTypeBuilder<Contact> entity)
{
entity.HasOne(e => e.Account)
.WithMany()
.HasForeignKey(e => e.AccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(e => e.Subscription)
.WithMany()
.HasForeignKey(e => e.SubscriptionId)
.OnDelete(DeleteBehavior.Cascade);
}
订阅配置:
public void Configure(EntityTypeBuilder<Subscription> entity)
{
entity.HasOne(e => e.Account)
.WithMany()
.HasForeignKey(e => e.AccountId)
.OnDelete(DeleteBehavior.Cascade);
}
这个想法是,当一个帐户被删除时,这将通过Cascade删除行为删除订阅,这将删除联系人,Restrict帐户和联系人之间的行为解决了“多级联路径”错误。
这在我本地运行时有效,我可以删除一个帐户并删除所有订阅和联系人,没有错误。问题在于单元测试(使用 xUnit),它在内存中使用 SQLite。我想测试删除帐户会删除所有联系人:
[Fact]
public async Task DeleteAccount_ContactIsDeleted()
{
using (var factory = new ContextFactory()) // same connection will be used within using block
{
using (var context = factory.CreateContext())
{
await context.SeedDatabaseOneContactAsync(); // inserts account, subscription and contact into database
}
繁花如伊
qq_花开花谢_0
慕尼黑的夜晚无繁华
相关分类