Dostosowywanie zachowania usunięcia
Usuwanie elementu zwykle powoduje powiązanych elementów, które mają zostać usunięte również.Wszystkie relacje podłączonych do niej, a wszystkie elementy podrzędne zostaną usunięte.To zachowanie jest o nazwie usunąć propagacji.Można dostosować propagacji delete, na przykład rozmieścić, że dodatkowe elementy pokrewne są usuwane.Pisząc kod programu, można wprowadzać, usuwać propagacji zależą od stanu modelu.Może powodować również inne zmiany występują w odpowiedzi na usunięcie.
Ten temat zawiera następujące sekcje:
Domyślne zachowanie usunięcia
Ustawianie opcji propagowanie Usuwanie roli
Przesłanianie zamknięcia usunąć — Użyj tej techniki, gdy usunięcie może doprowadzić do usunięcia między sąsiednimi elementami.
Korzystanie z OnDeleting i OnDeleted — Użyj tych metod, gdzie odpowiedzi może zawierać innych działań, takich jak zaktualizowanie wartości wewnątrz lub poza magazynu.
Zasady usuwania – propagował aktualizacji dowolnego rodzaju w magazynie, gdzie jednej zmiany mogą prowadzić do innych osób za pomocą reguł.
Usuwanie zdarzenia – zdarzenia magazynu użycia do propagowania aktualizacji poza Sklepu, na przykład do innych Visual Studio dokumentów.
Rozdziel – za pomocą operacji Rozdziel można cofnąć operacji scalania, do którego dołączony elementem podrzędnym elementu nadrzędnego.
Domyślne zachowanie usunięcia
Domyślnie Usuń propagacji rządzą następujące zasady:
Jeśli element zostanie usunięty, wszystkie elementy osadzone są również usuwane.Osadzone elementy są te, które są cele osadzania relacje, dla których ten element jest źródłem.Na przykład w przypadku osadzania relacji z albumu do utworu, następnie po usunięciu określonego albumu jego utwory również jest usuwany.
Natomiast usunięcie utworu nie powoduje usunięcia tego albumu.
Domyślnie usunięcie nie propaguje wzdłuż relacje odniesienia.W przypadku relacji odniesienia ArtistPlaysOnAlbum z albumu do wykonawcy, Usuwanie albumu nie usuwa wszelkie pokrewne wykonawcy i usunięcie artysta nie powoduje usunięcia żadnych albumu.
Jednakże usunięcie propagować wzdłuż niektórych trwałymi relacjami.Na przykład po usunięciu elementu modelu jego kształt na diagramie jest również usunięte.Element i kształtu są powiązane przez PresentationViewsSubject odwołać relacji.
Skreśla się każdy relację, którą jest połączony element, albo na rolę źródłowego lub docelowego.Właściwości roli elementu na przeciwny roli zawiera już usuniętego elementu.
Ustawianie opcji propagowanie Usuwanie roli
Może spowodować usunięcie propagowanie wzdłuż relacji odniesienia lub osadzone podrzędnych do obiektu nadrzędnego.
Aby ustawić propagacji delete
Na diagramie definicji DSL, zaznacz rolę do której ma propagacji do usunięcia.Rola jest reprezentowane przez wiersz po lewej lub po prawej stronie pola relacji do domeny.
Na przykład jeśli chcesz określić, że w każdym przypadku, gdy jest usuwany Album, Artyści pokrewni są również usuwane, a następnie wybierz rolę, podłączony do domeny klasy wykonawcy.
W oknie dialogowym właściwości ustaw Propaguje usunąć właściwości.
Naciśnij klawisz F5 i sprawdź, czy:
Po usunięciu wystąpienia tej relacji elementu w wybranej roli również zostaną usunięte.
Po usunięciu elementu w pełni funkcję przeciwną wystąpień tej relacji zostanie usunięta i powiązanych elementów na tej roli zostaną usunięte.
Można również wyświetlić Propaguje usunąć opcji w Szczegóły DSL okna.Wybierz klasę domeny, a następnie otwórz w oknie Szczegóły DSL Usuń zachowanie stronę, klikając przycisk na stronie okna.Propagowanie opcji jest wyświetlane dla przeciwną poszczególnych relacji.Usuń styl kolumna wskazuje, czy propagowanie opcji znajduje się na jego ustawienie domyślne, ale nie ma żadnego skutku oddzielne.
Usuń propagacji przy użyciu kodu programu
Opcje w pliku definicji DSL umożliwiają jedynie wybrać, czy usunięcie Propaguj do natychmiastowego sąsiada.Aby zaimplementować bardziej złożonych systemu usuń rozmnażania, można napisać kod programu.
[!UWAGA]
Aby dodać kod programu do definicji sieci DSL, należy utworzyć plik osobnego kodu w Dsl projektu i zapisywać definicje częściowe uzupełniającej klas w folderze wygenerowany kod.Aby uzyskać więcej informacji, zobacz Pisanie kodu, aby dostosować język specyficzne dla domeny.
Definiowanie zamknięcia Delete
Operacja usuwania używa klasy YourModelDeleteClosure , aby określić, które elementy do usunięcia, biorąc pod uwagę początkowej selekcji.Wywołuje ShouldVisitRelationship() i ShouldVisitRolePlayer() wielokrotnie, idzie wykresu relacje.Można zastąpić te metody.ShouldVisitRolePlayer jest dostarczany z tożsamości łącza i elementu na jedną z ról dla łącza.Należy zwrócić jedną z następujących wartości:
VisitorFilterResult.Yes– Powinny zostać skreślone elementu i walker, należy przejść do spróbuj elementu przez inne łącza.
VisitorFilterResult.DoNotCare– Elementu nie można usunąć, chyba że innej kwerendy odpowiedzi, że powinien on zostać usunięty.
VisitorFilterResult.Never– Elementu nie wolno usuwać, nawet jeśli odpowiada na kwerendy innego Yes, i walker, nie należy spróbować elementu przez inne łącza.
// When a musician is deleted, delete their albums with a low rating.
// Override methods in <YourDsl>DeleteClosure in DomainModel.cs
partial class MusicLibDeleteClosure
{
public override VisitorFilterResult ShouldVisitRolePlayer
(ElementWalker walker, ModelElement sourceElement, ElementLink elementLink,
DomainRoleInfo targetDomainRole, ModelElement targetRolePlayer)
{
ArtistAppearsInAlbum link = elementLink as ArtistAppearsInAlbum;
if (link != null
&& targetDomainRole.RolePlayer.Id == Album.DomainClassId)
{
// Count other unvisited links to the Album of this link.
if (ArtistAppearsInAlbum.GetLinksToArtists(link.Album)
.Where(linkAlbumArtist =>
linkAlbumArtist != link &&
!walker.Visited(linkAlbumArtist))
.Count() == 0)
{
// Should delete this role player:
return VisitorFilterResult.Yes;
}
else
// Don’t delete unless another relationship deletes it:
return VisitorFilterResult.DoNotCare;
}
else
{
// Test for and respond to other relationships and roles here.
// Not the relationship or role we’re interested in.
return base.ShouldVisitRolePlayer(walker, sourceElement,
elementLink, targetDomainRole, targetRolePlayer);
}
}
}
Technika zamknięcia zapewnia ustalona zbiór elementów i łącza, które mają zostać usunięte, przed rozpoczęciem usuwania.Walker również łączy wyniki zamknięcie z przywozem z innych części modelu.
Jednakże technika zakłada, usunięcie ma wpływ na tylko jej Sąsiedzi w wykresie relacje: nie można użyć tej metody, aby usunąć element w innej części modelu.Nie można używać go, jeśli chcesz dodać elementy lub wprowadzania innych zmian w odpowiedzi na usunięcie.
Korzystanie z OnDeleting i OnDeleted
Można zastąpić OnDeleting() lub OnDeleted() w klasie domeny lub w relacji do domeny.
OnDeletingnazywa się kiedy element ma zostać usunięty, ale przed jej relacje odłączony.Jest nadal żeglownych do i od innych elementów i jest nadal w store.ElementDirectory.
Usunięcie kilku elementów w tym samym czasie OnDeleting nazywa się wszystkie z nich przed wykonaniem operacji usuwania.
IsDeletingjest true.
OnDeletedjest wywoływane, gdy element został usunięty.Pozostaje w stosie CLR tak, aby w razie potrzeby można wykonać polecenia Cofnij, ale niepołączone z innymi elementami i usuwane z store.ElementDirectory.W przypadku relacji role nadal odniesienia starych pełniących role.IsDeleted is true.
OnDeleting i OnDeleted są nazywane, gdy użytkownik wywołuje Cofnij po utworzeniu elementu i usunięcie wcześniejszych powtarzającym się polu Ponów.Użyj this.Store.InUndoRedoOrRollback do uniknięcia aktualizacji magazynu elementów w tych przypadkach.Aby uzyskać więcej informacji, zobacz Jak: transakcji można użyć do aktualizacji modelu.
Na przykład poniższy kod usuwa albumu po usunięciu jego ostatni element podrzędny Song:
// Delete the parent Album when the last Song is deleted.
// Override methods in the embedding relationship between Album and Song:
partial class AlbumHasSongs
{
protected override void OnDeleted()
{
base.OnDeleted();
// Don't perform in-store actions in undo:
if (this.Store.InUndoRedoOrRollback) return;
// Relationship source and target still work:
// Don't bother if source is already on its way out:
if (!this.Album.IsDeleting && !this.Album.IsDeleted)
{
if (this.Album.Songs.Count == 0)
{
this.Album.Delete();
} } } }
Często jest bardziej użyteczne do wyzwalacza przed usunięciem relacji niż element roli, ponieważ to działa, zarówno gdy element zostanie usunięty, a po usunięciu samą relację.Jednak w przypadku relacji odniesienia może być propagowanie usunięcie po usunięciu elementu powiązanego, ale nie wtedy, gdy jest usuwany samą relację.W tym przykładzie usuwa Album, po jej ostatnim wykonawcę zostanie usunięty, ale nie odpowie, jeśli relacje zostaną usunięte:
using System.Linq; ...
// Assumes a many-many reference relationship
// between Artist and Album.
partial class Artist
{
protected override void OnDeleting()
{
base.OnDeleting();
if (this.Store.InUndoRedoOrRollback) return;
List<Album> toDelete = new List<Album>();
foreach (Album album in this.Albums)
{
if (album.Artists.Where(artist => !artist.IsDeleting)
.Count() == 0)
{
toDelete.Add(album);
}
}
foreach (Album album in toDelete)
{
album.Delete();
} } }
Podczas wykonywania Delete na element, zostanie wywołany OnDeleting i OnDeleted.Metody te są zawsze wykonywane wbudowane – oznacza to, bezpośrednio przed i po usunięciu rzeczywiste.Jeśli kod usuwa dwa lub więcej elementów, OnDeleting i OnDeleted zostanie wywołana w alternatywy we wszystkich tych kolei.
Zasady usuwania i wydarzenia
Jako alternatywę do obsługi OnDelete można zdefiniować zasady usuwania i zdarzenia do usunięcia.
Deletingi Delete zasady są wyzwalane tylko w transakcji, a nie w Cofnij i ponów.Można ustawić je umieścić w kolejce do wykonania na koniec transakcji, w którym wykonywane jest usunięcie.Usuwanie zasady są zawsze wykonywane przed wszelkich przepisów usuniętych, które znajdują się w kolejce.
Użyj reguł do propagowania zmian wpływających tylko elementy w magazynie, w tym relacji, diagram elementów i ich właściwości.Zazwyczaj reguła usuwanie jest używany do propagowania usunięcia i Reguła usuwania jest używany do tworzenia elementów wymiany i relacji.
Aby uzyskać więcej informacji, zobacz Zasady propagowanie zmian w ramach modelu.
Deletedzdarzenia magazynu jest wywoływane z końcem transakcji i jest wywoływana po wykonaniu polecenia Cofnij lub Ponów.Może więc służyć do propagowania usuwania obiektów poza magazynu, takich jak pliki, wpisy do bazy danych lub innych obiektów w Visual Studio.
Aby uzyskać więcej informacji, zobacz Programy obsługi zdarzeń propagowanie zmian poza modelu.
Przestroga Po usunięciu elementu można uzyskać dostęp do jego wartości właściwości domeny, ale nie może przejść łącza relacji.Jednakże jeśli usunięto zdarzenie zostanie ustawiona na relacji, również dostęp dwa elementy, które zostały jej pełniących role.W związku z tym aby odpowiedzieć na usunięcie elementu modelu, ale chcesz uzyskać dostęp do elementu, w którym był połączony, należy ustawić zdarzenia delete na relacji zamiast elementu modelu domeny klasy.
Przykład usuwania zasad
[RuleOn(typeof(Album), FireTime = TimeToFire.TopLevelCommit)]
internal class AlbumDeletingRule : DeletingRule
{
public override void ElementDeleting(ElementDeletingEventArgs e)
{
base.ElementDeleting(e);
// ...perform tasks to propagate imminent deletion
}
}
[RuleOn(typeof(Album), FireTime = TimeToFire.TopLevelCommit)]
internal class AlbumDeletedRule : DeleteRule
{
public override void ElementDeleted(ElementDeletedEventArgs e)
{
base.ElementDeleted(e);
// ...perform tasks such as creating new elements
}
}
// The rule must be registered:
public partial class MusicLibDomainModel
{
protected override Type[] GetCustomDomainModelTypes()
{
List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
types.Add(typeof(AlbumDeletingRule));
types.Add(typeof(AlbumDeletedRule));
// If you add more rules, list them here.
return types.ToArray();
}
}
Przykład usunięto zdarzenie
partial class NestedShapesSampleDocData
{
protected override void OnDocumentLoaded(EventArgs e)
{
base.OnDocumentLoaded(e);
DomainRelationshipInfo commentRelationship =
this.Store.DomainDataDirectory
.FindDomainRelationship(typeof(CommentsReferenceComponents));
this.Store.EventManagerDirectory.ElementDeleted.Add(commentRelationship,
new EventHandler<ElementDeletedEventArgs>(CommentLinkDeleted));
}
private void CommentLinkDeleted (object sender, ElementDeletedEventArgs e)
{
CommentsReferenceComponents link = e.ModelElement as CommentsReferenceComponents;
Comment comment = link.Comment;
Component component = link.Subject;
if (comment.IsDeleted)
{
// The link was deleted because the comment was deleted.
System.Windows.Forms.MessageBox.Show("Removed comment on " + component.Name);
}
else
{
// It was just the link that was deleted - the comment itself remains.
System.Windows.Forms.MessageBox.Show("Removed comment link to "
+ component.Name);
}
}
}
Rozdzielanie
Operacja, łączący elementem podrzędnym elementu nadrzędnego jest nazywana korespondencji seryjnej.Występuje, gdy nowy element lub grupy elementów jest utworzone z przybornika, lub przeniesiony z innej części modelu lub skopiowane ze Schowka.Jak również tworzenie osadzania stosunek jednostki dominującej oraz jej nowy element podrzędny, operacji scalania można również skonfigurować dodatkowe relacje, tworzenie elementów pomocniczych i ustawiania wartości właściwości elementów.Operację scalania jest hermetyzowany w dyrektywie korespondencji seryjnej elementu (EMD).
EMD również hermetyzuje uzupełniające Rozdzielanie lub MergeDisconnect operacji.Jeśli masz klastra elementów, która została skonstruowana przy użyciu korespondencji seryjnej, zalecane jest użyć skojarzonym rozdzielanie Aby usunąć element z niego, jeśli chcesz pozostawić pozostałych elementów w stanie spójnym.Operacja Rozdziel zazwyczaj będzie używać techniki opisane w poprzednich sekcjach.
Aby uzyskać więcej informacji, zobacz Dostosowywanie tworzenia elementu i przepływu.
Zobacz też
Koncepcje
Dostosowywanie zachowania kopii
Dostosowywanie tworzenia elementu i przepływu