EF 5.0删除无法正常工作

时间:2015-10-02 19:44:09

标签: c# entity-framework entity-framework-5

快速摘要 我有两个场景 -

  1. Person的{​​{1}}只有PersonalAddress,只属于他们。
  2. Address的{​​{1}} Person共享PersonalAddress
  3. 当用户尝试删除案例1中的某人的地址时,需要删除Address以及相关的CorporateAddress。 (我目前正在努力。)

    当用户厌烦删除案例2中的某人的地址时,需要删除PersonalAddress记录,但Address记录需要保留,因为它与{{{{}}相关联1}}。 这是我遇到问题的地方。如果我不删除PersonalAddress,我似乎无法删除Address

    我的设置详情

    我的业务要求是我需要一个共同的地址列表。其中一些地址是公司地址,一些是个人地址。但是,有许多人使用公司地址作为个人地址。在这种情况下,我们宁愿引用现有地址而不是创建新地址,这样如果公司地址发生变化,那么共享该地址的任何人也会更新。

    我有以下POCO对象(我简称为了简化)

    CorporateAddress

    它们具有以下EF映射:

    PersonalAddress

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

    如果我尝试删除与公司地址绑定的 NOT 个人地址,我可以使用以下内容:

    Address

    但是,如果地址已共享,我不想删除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;} ... } ,我只想删除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();
    

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

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

    我使用的是EF 5.0

2 个答案:

答案 0 :(得分:0)

尝试将地址State设置为EntityState.Deleted。

答案 1 :(得分:0)

看看SO Question,我认为接受的答案应该指向正确的方向。你如何选择解决它取决于你,但我认为这说明了为什么EF表现得如此。