【发布时间】:2021-11-14 17:16:59
【问题描述】:
我有一个简单的 EF Core 模型,其中包含两个实体,位置和地址,其中位置必须始终具有地址。
实体及其配置如下:
public class Location {
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int AddressId { get; set; }
[ForeignKey("AddressId")]
public virtual Address Address { get; set; }
}
public class Address {
public virtual int AddressId { get; set; }
public string LineOne { get; set; }
public string LineTwo { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string ZipPostCode { get; set; }
public string State { get; set; }
public string LandlinePhone { get; set; }
public string MobilePhone { get; set; }
}
// Context configuration
...
protected override void OnModelCreating(ModelBuilder modelBuilder) {
...
modelBuilder.Entity<Location>().HasOne(l => l.Address).WithOne().OnDelete(DeleteBehavior.Cascade);
...
}
...
注意:地址实体没有对位置的引用。
使用上述配置,删除位置应删除其地址,但删除地址应导致引用完整性错误。使用 EF InMemory 数据库通过单元测试尝试上述操作会产生意想不到的结果:
[Test]
public void DeleteAddressShouldNotDeleteLocation() {
var address = new Address();
var location = new Location() {Address = address};
_context.Locations.Add(location);
_context.SaveChanges();
// Delete the address added above
_context.Addresses.Remove(_context.Addresses.Single());
_context.SaveChanges();
Assert.AreEqual(1, _context.Locations.Count()); --> ALWAYS FAILS AS THE LOCATION IS CASCADE DELETED
}
这也发生在我们的生产服务器 (Azure SQL) 上,因此它不应该是 EF Core 的问题。
EF 将地址删除级联到 Location 有什么原因吗?
【问题讨论】:
标签: c# ef-core-3.1