Print Page | Close Window

Foreign Key Questions

Printed From: IdeaBlade
Category: DevForce
Forum Name: DevForce 2009
Forum Discription: For .NET 3.5
URL: http://www.ideablade.com/forum/forum_posts.asp?TID=1293
Printed Date: 22-Sep-2025 at 4:22am


Topic: Foreign Key Questions
Posted By: Amy
Subject: Foreign Key Questions
Date Posted: 01-Jun-2009 at 9:45am

Our database has a lot FKs that are integers. Some of them are required filed, some of them are not.  I have some questions:

 

1.      For required FK,  how do you write your own verifier? DevForce’s default verifier for required FK is always returns OK, no matter what. I tried to write a range verifier for the required FK, it always returns OK too.   How do you enforce the required FK?

2.      In edit screen, how do you fill the ComboBox of non-required FK? Add a null entity? Since it is not required, the user should be able to change the ComboBox to select nothing.

 

Any help/suggestion would be appreciated.

 

 

Thanks!

 

Amy




Replies:
Posted By: davidklitzke
Date Posted: 02-Jun-2009 at 8:13am

For answers and tips on writing your own verifiers, see the Intermediate tutorial on "Verification".

For an example of the use of a combobox that uses the Null Entity, see the Intermediate tutorial on "Working with ComboBoxes".  In this tutorial, a Null Entity is used to indicate that an Employee has no Manager.


Posted By: Amy
Date Posted: 02-Jun-2009 at 11:19am
#1   I mentioned in my question: I did add a range verifier, but it returns OK. Is anything wrong with following code?
 
private static Verifier GetOperationIDRequiredVerifier()

{ return new Int32RangeVerifier(typeof(Vehicle), Vehicle.Operation_fk_OperationIDEntityProperty.Name,

true, 0, int.MaxValue);}

#2 We also added an NullEntity on each non-requied FK. Since we have  a lot FKs,  wish there is a better solution.
 
 
Thanks!


Posted By: eileenv
Date Posted: 18-Jun-2009 at 2:39pm

What is your rule for "Required FKs"? Is it that the value must be greater than 0? If the FKs are not nullable ints, then you would need some numeric rule for determining whether or not the FK is valid.

Here is how to write a verifier that says "ID must be greater than 0":

private static Verifier GetOperationIDRequiredVerifier() {
    return new Int32RangeVerifier(
        typeof(Vehicle), Vehicle.Operation_fk_OperationIDEntityProperty.Name,
        true,
        0,          // minValue = 0
        false,     // do not include the minEndpoint  
        null,       // don't care about maxValue
        false);    // do not include the maxEndpoint
}
 
The problem with the original verifier you wrote is that you were basically saying that any ID from 0 to the maximum integer value is OK and valid.


Posted By: jeffdoolittle
Date Posted: 18-Jun-2009 at 8:50pm
I haven't done this for EF yet, but in DevForce classic, I took a different approach that worked really well for discovering potential FK violations prior to saving to the database.

1) I created an algorithm that looks at all EntityRelations and discovers all relations where the parent entity is required.  This process discovers the parent property descriptor for the parent relation and looks for the "RequiredValueVerifierAttribute" on that property.  It's a bit complex, but it works great for discovering the parent required properties.

2) I created a "NotNullEntityVerifier" that fails if an entity is the null entity.

3) I created a helper method that, when given an entity type, adds a NotNullEntityVerifier to the VerifierEngine for all required parent properties of the given type.

When all is said and done, all I have to do is go to my GetVerifiers static method for an entity type and do this:

        [VerifierProvider]
        public static IEnumerable<Verifier> GetVerifiers(Object pVerifierProviderContext)
        {
            var engine = GetEngineFromVerifierProviderContext(pVerifierProviderContext);
            var list = new List<Verifier>();
            list.AddParentRequiredVerifiers<Employee>();
            return list;
        }

If you are so inclined, you could even call this method for all entity types in your Model assembly all at once rather than calling this once for each entity type (though in a large model this may not be advisable).

It's almost like magic when your Foreign Keys are enforced completely in the middle tier.

If any one is interested in the code, post on this thread and I'll try to find time to clean up and add this code to the DevForceContrib project on CodePlex (http://devforcecontrib.codeplex.com/).


--Jeff


Posted By: Amy
Date Posted: 24-Jun-2009 at 9:28am
Hi Jeff,
 
 
I am  interested in the code. Please post it whenever you have time.
 
Thank you very much!
 
Amy
 


Posted By: Amy
Date Posted: 28-Jun-2009 at 7:20am
Check if FK > 0 is not really working. When adding parent, also adding related children in the same time, the FKs for children  are negative.
 
Amy



Print Page | Close Window