मैं एक एसएसएल सर्वर 2012 एक्सप्रेस डीबी द्वारा समर्थित एंटिटी-फ्रेमवर्क कोर (संस्करण "EntityFramework.Core": "7.0.0-rc1-final"
) के साथ एएसपी.नेट एमवीसी 6 प्रोजेक्ट पर काम कर रहा हूं।एंटिटी फ्रेमवर्क कोर कोड-फर्स्ट: कैस्केड कई से कई रिश्तों को हटाता है
मुझे Person
इकाई और Address
इकाई के बीच कई से अधिक रिश्तों को मॉडल करने की आवश्यकता है। this गाइड के अनुसार मैंने इसे PersonAddress
जॉइन-टेबल इकाई के साथ मॉडल किया, क्योंकि इस तरह से मैं कुछ अतिरिक्त जानकारी स्टोर कर सकता हूं।
- एक
Person
उदाहरण नष्ट कर दिया जाता है, तो सभी संबंधितPersonAddress
उदाहरणों से हटाना होगा:मेरे लक्ष्य सेट अप करने के लिए अपने सिस्टम इस तरह से है। सभी
Address
उदाहरण जिन्हें वे संदर्भित करते हैं उन्हें भी हटाया जाना चाहिए, केवल तभी यदि वे अन्यPersonAddress
उदाहरणों से संबंधित नहीं हैं। - यदि
PersonAddress
उदाहरण हटा दिया गया है, तोAddress
उदाहरण यह केवल तब से हटाया जाना चाहिए जब यह अन्यPersonAddress
उदाहरणों से संबंधित नहीं है। सभीPerson
उदाहरण जीना चाहिए। - यदि
Address
उदाहरण हटा दिया गया है, तो सभी संबंधितPersonAddress
उदाहरण हटा दिए जाने चाहिए। सभीPerson
उदाहरण जीना चाहिए।
मुझे लगता है कि काम के सबसे Person
और Address
के बीच कई-से-अनेक संबंध में किया जाना चाहिए, लेकिन मैं कुछ तर्क भी लिखने के लिए उम्मीद है। मैं इस सवाल से इस हिस्से को छोड़ दूंगा। मुझे इसमें दिलचस्पी है कि मेरे कई से अधिक रिश्तों को कैसे कॉन्फ़िगर किया जाए।
वर्तमान स्थिति है।
यह Person
इकाई है। कृपया ध्यान दें कि इस इकाई को अन्य माध्यमिक संस्थाओं के साथ एक से कई रिश्ते मिल गए हैं।
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
}
यह Address
इकाई है।
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
}
यह PersonAddress
इकाई है।
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
}
यह DatabaseContext
इकाई है, जहां सभी रिश्तों में वर्णित किया जाता है।
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();
}
}
दोनों Telephone
और City
संस्थाओं सरलता के लिए हटा दिया गया है।
यह Person
को हटाने के लिए कोड है।
Person person = await _context.People.SingleAsync(m => m.Id == id);
try
{
_context.People.Remove(person);
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
}
मेरी रीडिंग .Include()
परहेज डीबी अंतिम CASCADE
हटाता की देखभाल करने देगा का सवाल है। मुझे खेद है, लेकिन मुझे एसओ सवाल याद नहीं है जहां इस अवधारणा को स्पष्ट किया गया था।
यदि मैं इस कोड को चलाता हूं तो मैं this workaround का उपयोग कर डीबी बीज कर सकता हूं।मैं परीक्षण-को हटाने से ऊपर कोड के साथ एक Person
इकाई चाहते हैं, तो मैं इस अपवाद:
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.
मैं किसी भी भाग्य के बिना DatabaseContext.OnModelCreating
विधि में कई रिश्ते व्यवस्था का परीक्षण किया।
अंत में, यहां मेरा प्रश्न है। लक्ष्य के मुताबिक Person
और मेरे आवेदन से संबंधित इकाइयों को सही तरीके से हटाने के लिए मुझे अपने कई से अधिक रिश्तों को कैसे कॉन्फ़िगर करना चाहिए?
सभी को धन्यवाद।