EF 5.0 删除不起作用

本文关键字:不起作用 删除 EF | 更新日期: 2023-09-27 18:15:50

快速摘要我有两个场景——

  1. Person有一个PersonalAddress,其Address只属于他们。
  2. Person具有共享CorporateAddress AddressPersonalAddress

当用户尝试删除案例 1 中的人员地址时,需要删除PersonalAddress以及相关的Address。 (我目前有这个工作。

当用户不厌其烦地删除某人的地址时,需要删除PersonalAddress记录,但需要保留Address记录,因为它与CorporateAddress相关联。 这就是我遇到麻烦的地方。 如果我不删除Address,我似乎无法删除PersonalAddress.

我的设置详情

我的业务需求是需要一个通用的地址列表。 其中一些地址是公司地址,有些是个人地址。 但是,有很多人使用公司地址作为个人地址。 在这种情况下,我们宁愿引用现有地址而不是创建新地址,以便在公司地址更改时,共享该地址的任何人也会更新。

我有以下 POCO 对象(我将缩写它们以使事情更简单(

public class Person {
   ...
   public ICollection<PersonalAddress> Addresses {get; private set;}
}
public class PersonalAddress {
   public int Id {get; set;}
   public Address Address {get; set;}  //not defining foreign key property here
   public PersonalAddressType AddressType {get; set;}
   public DateTime? StartDate {get; set;}
   ...
}
public class Address {
   public int Id {get; set;}
   public string Street1 {get; set;}
   public string Street2 {get; set;}
   ...
}
public class CorporateAddress {
  public int Id {get; set;}
  public int AddressId {get; set;}  //foreign key to address table
  public Address Address {get; set;}
  public string Description {get; set;}
  ...
}

它们具有以下 EF 映射:

modelBuilder.ToTable("persons");
modelBuilder.Entity<Person>()
  .HasMany(p => p.Addresses)  //PersonalAddress
  .WithRequired().Map(m => { m.MapKey("personId"); } );
modelBuilder.Entity<Address>().ToTable("addresses");
modelBuilder.Entity<Address>().HasKey(a => a.Id);
modelBuilder.Entity<PersonalAddress>().ToTable("PersonalAddresses");
modelBuilder.Entity<PersonalAddress>()
   .HasRequired(p => p.Address)
   .WithMany()
   .Map(m => {m.MapKey("addressid");}); //map FK because not defined on object
modelBuilder.Entity<CorporateAddress>().ToTable("corporateAddresses");
modelBuilder.Entity<CorporateAddress>()
   .HasRequired(c => c.Address)
   .WithMany()
   .HasForeignKey(c => c.AddressId);

有了所有这些,我可以在公司方面和个人方面成功添加和更新地址。 我还可以添加引用现有公司地址的个人地址。

如果我尝试删除公司地址无关的个人地址,我可以执行以下操作:

var _person = _context.Persons
    .Include(p => p.Addresses.Select(a => a.Address))
    .SingleOrDefault(p => p.Id == personId);
var _address = _person.Addresses.SingleOrDefault(a => a.Address.Id == addressId);
_person.Addresses.Remove(_address); ''gets rid of the PersonalAddress
_context.Set<Address>().Remove(_address.Address); ''gets rid of the Address
_context.SaveChanges();

但是在地址共享的情况下,我不想删除Address,我只想删除PersonalAddress。 尝试上述方法不起作用(当然,我不执行第二行 - 删除地址(。

我还尝试了以下方法:

_address.Address = null; ''Destroy the link to the Address
_person.Addresses.Remove(_address); ''gets rid of the PersonalAddress
_context.SaveChanges();

在这种情况下,个人地址和地址都不会被删除。

如何在 EF 中完成这样的事情 - 或者我只是在推动 EF 可以做的极限。

我正在使用 EF 5.0

EF 5.0 删除不起作用

尝试将地址"状态"设置为"实体状态"。