Bir SQL Server 2012 express DB tarafından desteklenen Entity-Framework Core (sürüm "EntityFramework.Core": "7.0.0-rc1-final"
) ile bir ASP.NET MVC 6 projesinde çalışıyorum.Entity Framework Çekirdek Kod-İlk: Çoktan-çok ilişkide Cascade sil
Person
öğesi ve Address
varlığı arasında çoktan çoğa ilişkiyi modellemeye ihtiyacım var. this kılavuzuna göre PersonAddress
birleşim tablosu öğesiyle modelledim, çünkü bu şekilde fazladan bilgi depolayabiliyorum. Bir Person
örneği silinirse
- , ilgili tüm
PersonAddress
örneklerini silinmesi gerekir:Benim gol set-up benim sistem bu şekilde olduğunu. Başvuruda bulundukları tüm
Address
örneklerinin de, yalnızca diğerPersonAddress
örnekleri ile ilişkili olmadıklarında silinmesi gerekir. PersonAddress
örneği silinirse, ilgiliAddress
örneğinin, yalnızca diğerPersonAddress
örnekleri ile ilgili değilse silinmesi gerekir. TümPerson
örneklerinin canlı olması gerekir.Address
örneği silinirse, ilgili tümPersonAddress
örneklerinin silinmesi gerekir. TümPerson
örneklerinin canlı olması gerekir.
Ben işin çoğunu Person
ve Address
arasında birçok çoğa ilişkide yapılmalıdır düşünüyorum, ama ben de bazı mantık yazmak için bekliyoruz. Bu bölümü bu sorudan çıkaracağım. İlgilendiğim şey, çoktan çoğa ilişkilerimi nasıl yapılandıracağım.
Güncel durumu. Bu bir Person
öğesidir. Bu öğenin diğer ikincil varlıklar ile bire çok ilişkisi olduğunu lütfen unutmayın.
public class Person
{
public int Id {get; set; } //PK
public virtual ICollection<Telephone> Telephones { get; set; } //navigation property
public virtual ICollection<PersonAddress> Addresses { get; set; } //navigation property for the many-to-many relationship
}
Bu, Address
öğedir.
public class Address
{
public int Id { get; set; } //PK
public int CityId { get; set; } //FK
public City City { get; set; } //navigation property
public virtual ICollection<PersonAddress> People { get; set; } //navigation property
}
Bu PersonAddress
varlıktır.
public class PersonAddress
{
//PK: PersonId + AddressId
public int PersonId { get; set; } //FK
public Person Person {get; set; } //navigation property
public int AddressId { get; set; } //FK
public Address Address {get; set; } //navigation property
//other info removed for simplicity
}
Bu tüm ilişkiler açıklanmıştır DatabaseContext
varlıktır.
public class DataBaseContext : DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<Address> Addresses { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
//All the telephones must be deleteded alongside a Person.
//Deleting a telephone must not delete the person it refers to.
builder.Entity<Person>()
.HasMany(p => p.Telephones)
.WithOne(p => p.Person);
//I don't want to delete the City when I delete an Address
builder.Entity<Address>()
.HasOne(p => p.City)
.WithMany(p => p.Addresses)
.IsRequired().OnDelete(Microsoft.Data.Entity.Metadata.DeleteBehavior.Restrict);
//PK for the join entity
builder.Entity<PersonAddress>()
.HasKey(x => new { x.AddressId, x.PersonId });
builder.Entity<PersonAddress>()
.HasOne(p => p.Person)
.WithMany(p => p.Addresses)
.IsRequired();
builder.Entity<PersonAddress>()
.HasOne(p => p.Address)
.WithMany(p => p.People)
.IsRequired();
}
}
Hem Telephone
ve City
kişiler basitlik amacıyla kaldırıldı.
Bu, Person
'un kaldırılmasına yönelik koddur. DB nihai CASCADE
siler özen sağlayacak .Include()
kaçınarak benim okumalar gelince
Person person = await _context.People.SingleAsync(m => m.Id == id);
try
{
_context.People.Remove(person);
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
}
. Üzgünüm ama bu kavramın açıklığa kavuşturulduğu SO sorusunu hatırlamıyorum.
Bu kodu çalıştırırsam, DB'yi this workaround kullanarak ekilebilir.Ben sınamak-silmeden yukarıdaki kod ile bir Person
varlık istediğinizde, bu durum almak:
The DELETE statement conflicted with the REFERENCE constraint "FK_PersonAddress_Person_PersonId". The conflict occurred in database "<dbName>", table "<dbo>.PersonAddress", column 'PersonId'.
The statement has been terminated.
Ben olmadan herhangi bir şans DatabaseContext.OnModelCreating
yöntemde birçok ilişki kurulumları test etti.
Son olarak, işte soru. Daha önce açıklanan hedef hedefine göre, bir Person
ve ilgili varlıklarını uygulamadan doğru bir şekilde silmek için çoktan çoğa ilişkimi nasıl yapılandırmalıyım?
Hepinize teşekkürler.