快速摘要 我有两个场景 -
Person
的{{1}}只有PersonalAddress
,只属于他们。Address
的{{1}} Person
共享PersonalAddress
。当用户尝试删除案例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
答案 0 :(得分:0)
尝试将地址State设置为EntityState.Deleted。
答案 1 :(得分:0)
看看SO Question,我认为接受的答案应该指向正确的方向。你如何选择解决它取决于你,但我认为这说明了为什么EF表现得如此。