Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 2e9c43658e374d290a2de15d25134ac8 > files > 599

db4o-doc-8.0-1.fc15.i686.rpm

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" MadCap:lastBlockDepth="2" MadCap:lastHeight="120" MadCap:lastWidth="624" MadCap:disableMasterStylesheet="true" MadCap:tocPath="Best Practices" MadCap:InPreviewMode="false" MadCap:RuntimeFileType="Topic" MadCap:TargetType="WebHelp" MadCap:PathToHelpSystem="../../" MadCap:HelpSystemFileName="index.xml" MadCap:SearchType="Stem">
    <head><title>Deleting Objects</title>
        <script type="text/javascript">/* <![CDATA[ */
window.onload = function(){
	var pathToFlash = $('html').attr('MadCap:PathToHelpSystem') + 'Content/Resources/Code/ZeroClipboard.swf';
	ZeroClipboard.setMoviePath(pathToFlash);
			
	function bindToClipBord(element,content){
		var clip = new ZeroClipboard.Client();
		clip.setText(content);
		clip.glue(element);
	};
		
	if(location.protocol==='file:'){
		$('.copylink-marker').remove();
	} else{
			$('.copylink-marker').each(function(){
				var text = $(this).parent().parent().children('.prettyprint').html();
				$(this).hover(function(){
					bindToClipBord(this,text);
				},
				function(){});
			});	
	}		
	prettyPrint();	
};
                /* ]]> */</script>
        <link href="../SkinSupport/MadCap.css" rel="stylesheet" />
        <link href="../Resources/Stylesheets/OnlineStyle.css" rel="stylesheet" />
        <script src="../Resources/Code/prettify.js">
        </script>
        <script src="../Resources/Code/lang-vb.js">
        </script>
        <script src="../Resources/Code/jquery.min.js">
        </script>
        <script src="../Resources/Code/ZeroClipboard.js">
        </script>
        <script src="../SkinSupport/MadCapAll.js" type="text/javascript">
        </script>
    </head>
    <body>
        <p class="MCWebHelpFramesetLink" style="display: none;"><a href="../../index_CSH.html#best_practises/deleting_objects.htm" style="">Open topic with navigation</a>
        </p>
        <div class="MCBreadcrumbsBox"><span class="MCBreadcrumbsPrefix">You are here: </span><a class="MCBreadcrumbsLink" href="../best_practises.htm">Best Practices</a><span class="MCBreadcrumbsDivider"> &gt; </span><span class="MCBreadcrumbs">Deleting Objects</span>
        </div>
        <p>
            <script type="text/javascript">/*<![CDATA[*/document.write('<a href="' + location.href +'">');
				document.write("Direct Link");
			document.write('</a>');/*]]>*/</script>
        </p>
        <p>
        </p>
        <h1>Deleting Objects</h1>
        <p>Deleting object is always a delicate process. Deleting the wrong object can be catastrophic. Here are some best practices for deleting objects.</p>
        <h2>Delete Flag</h2>
        <p>When a end user deletes a object it's often better to use a deleted-flag instead of actually deleting the data. This has the advantage that you can undo the delete operation at any time. Also you don't break the model in cases where the user deleted the wrong object. However it has also some disadvantages. You need to honor the deleted-flag in your queries. </p>
        <p>You can set the delete flag in a <a href="../advanced_topics/callbacks.htm">callback</a> and use the regular db4o delete operation:</p>
        <div class="codesnippet" MadCap:conditions="Primary.VB.NET">
            <pre class="prettyprint lang-vb" MadCap:conditions="Primary.Online" xml:space="preserve">Private Shared Sub HandleDeleteEvent(ByVal sender As Object, ByVal args As CancellableObjectEventArgs)
    Dim obj As Object = args.Object
    ' if the object has a deletion-flag:
    ' set the flag instead of deleting the object
    If TypeOf obj Is Deletable Then
        DirectCast(obj, Deletable).Delete()
        args.ObjectContainer().Store(obj)
        args.Cancel()
    End If
End Sub</pre>
            <div class="codesnippet-meta">DeletionStrategies.vb: The delete event handler
			<div class="codedownload"><a href="../CodeExamples/practises/deletion/Example-practises-deletion-vb.zip" class="codedownload" MadCap:conditions="Primary.Online">Download Code</a></div><div class="codedownload copylink-marker" MadCap:conditions="Primary.Online"><a href="#copy">Copy Code</a></div></div>
        </div>
        <div class="codesnippet" MadCap:conditions="Primary.c#">
            <pre class="prettyprint" xml:space="preserve">IEventRegistry events = EventRegistryFactory.ForObjectContainer(container);
events.Deleting +=
    (sender, args) =&gt;
        {
            object obj = args.Object;
            // if the object has a deletion-flag:
            // set the flag instead of deleting the object
            if (obj is Deletable)
            {
                ((Deletable) obj).Delete();
                args.ObjectContainer().Store(obj);
                args.Cancel();
            }
        };</pre>
            <div class="codesnippet-meta">DeletionStrategies.cs: Deletion-Flag
			<div class="codedownload"><a href="../CodeExamples/practises/deletion/Example-practises-deletion-csharp.zip" class="codedownload" MadCap:conditions="Primary.Online">Download Code</a></div><div class="codedownload copylink-marker" MadCap:conditions="Primary.Online"><a href="#copy">Copy Code</a></div></div>
        </div>
        <div class="codesnippet" MadCap:conditions="Primary.VB.NET">
            <pre class="prettyprint lang-vb" MadCap:conditions="Primary.Online" xml:space="preserve">Dim events As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)
AddHandler events.Deleting, AddressOf HandleDeleteEvent</pre>
            <div class="codesnippet-meta">DeletionStrategies.vb: Deletion-Flag
			<div class="codedownload"><a href="../CodeExamples/practises/deletion/Example-practises-deletion-vb.zip" class="codedownload" MadCap:conditions="Primary.Online">Download Code</a></div><div class="codedownload copylink-marker" MadCap:conditions="Primary.Online"><a href="#copy">Copy Code</a></div></div>
        </div>
        <p>However you need to filter the deleted objects in every query. </p>
        <p>&#160;</p>
        <h2>Be Very Careful</h2>
        <p>db4o doesn't support any referential integrity. When you delete a object and there's still a reference to that object this reference is set to null. This means if you delete a object you may break the consistency of you're object model. </p>
        <p>This means also that you need to implement any consistency check yourself on top of db4o. You can use db4o <a href="../advanced_topics/callbacks.htm">callbacks</a> for doing so. </p>
        <h2>Use Cascade Deletion Wisely</h2>
        <p>You can configure db4o the cascade delete referenced objects. You can configure that for <a href="../configuration/objectclass/cascade_on_delete.htm">certain type</a> or <a href="../configuration/objectfield_configuration.htm#CascadeDelete">certain fields</a>. As said there's no referential integrity checks for db4o, so you have to extreamly conscious where to use this feature. It makes sense to configure cascade deletion for composition roots, where you are sure that the children cannot be referenced from another location. In all other places it's a bad idea most of the time. </p>
        <p>
        </p>
        <script type="text/javascript" src="../SkinSupport/MadCapBodyEnd.js">
        </script>
    </body>
</html>