Amberite
Amberite

Reputation: 1409

Validating a field based on a different database table / entity

I am writing an MVC 4 application, and using Entity Framework 4.1. I have a validation question which I cannot seem to find the answer to.

Essentially, I have an Entity (object) called "Product" which contains a field "Name", which must follow strict naming conventions which are defined in a separate Entity called "NamingConvention". When the user enters a value, the system needs to check it against the rules established in the NamingConvention entity, and return an error if need be.

Where should this validation be done, and how? I need to check the NamingConvention entity when doing the validation, which means I would need a database context since I'm referencing a different entity. Is there any validation method which won't require me to create a new context? I was thinking of doing the validation in the Controller, since it already creates a data context, but this doesn't seem like the right place to do it.

Thanks for any help!

Upvotes: 0

Views: 242

Answers (2)

Tim Newton
Tim Newton

Reputation: 925

I have done things like this using a JQuery post (ajax) call from the webpage where the name is being entered. You then post (the value of name) to a method on your controller which can return a JSON value that contains a flag saying if the validation passed and also a message that you want to return to your user. For example :

Javascript in webpage :

$("#name").change(function () {

var nameVal = $(this).val();

$.post(getRoot() + "/NameController/ValidateName", { name: nameVal },
function (data) {
    if (data.valid == "true") {
        alert("A valid name was chosen");
    } else
    {
        alert(data.message);
    }
}, "json");

});

Controller (NameController) Code :

 [HttpPost]
 public ActionResult ValidateName(string name)
 {
   // actual validation carried out in a static utility class (Utils.IsNameValid)
   // if you are loading the same validation rules from your table each time
   // consider caching the data in the application cache or a static List.

   bool nameIsValid = Utils.IsNameValid(name, out string ErrorMessage);

   JsonResult result = new JsonResult();

   result.Data = new { valid = (nameIsValid "true" : "false"), message = ErrorMessage };

   return result;


  }

Upvotes: 1

qujck
qujck

Reputation: 14578

I'm using EF 5 but believe you can use this method ... apologies in advance if I'm misleading you with this answer.

You could do the validation within your context (or a context decorator)

public override int SaveChanges()
{
    var products = this.GetChangedProducts();

    foreach (var product in products)
    {
        this.ValidateName(product);
    }

    return base.SaveChanges();
}

private IEnumerable<Product> GetChangedProducts()
{
    return (
        from entry in _context.ChangeTracker.Entries()
        where entry.State != EntityState.Unchanged
        select entry.Entity)
        .OfType<Product>();
}

private void ValidateName(Product product)
{
    //validate here
}

Upvotes: 0

Related Questions