Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add data annotation for entities automatically created by Data-First?

If model-first, we use [MetadataType(typeof(ConceptMetadataSource))] to attach a MetadataSource file which contains all the data annotations like [HiddenInput(DisplayValue = false)] or [Display(Name = "Title")].

For example:

[MetadataType(typeof(ConceptMetadataSource))]
public partial class Concept
...

Now, I am using database-first approach since there is an existing database. This time, the entity classes are automatically created by edmx model. At the beginning of each entity class, there is lines of comment below:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

Since the code will be regenerated once we modify a table in the database, the data annotations will be wiped out each time the entity classes are regenerated.

Can anyone tell me what is the best method to annotate those entity classes? Thank you.

like image 986
Blaise Avatar asked Jan 19 '12 19:01

Blaise


People also ask

Is fluent API better than data annotation attributes?

The fluent API is considered a more advanced feature and we would recommend using Data Annotations unless your requirements require you to use the fluent API. But in my opinion you reach the limitations of DataAnnotations very quickly (except perhaps for extremely simple object models).

What is data annotations in Entity Framework?

DataAnnotations is used to configure the classes which will highlight the most commonly needed configurations. DataAnnotations are also understood by a number of . NET applications, such as ASP.NET MVC which allows these applications to leverage the same annotations for client-side validations.


2 Answers

All you have to do is create another partial class and use metadatatype attribute. Here is the sample code

//This is generated by EDMX

namespace DataLayer
{
    using System;
    using System.Collections.Generic;

    public partial class Customer
    {
        public Customer()
        {
            this.CustomerAddresses = new HashSet<CustomerAddress>();
            this.CustomerOrders = new HashSet<CustomerOrder>();
        }

        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EmailId { get; set; }


        public Nullable<System.DateTime> DateOfBirth { get; set; }

        public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
        public virtual ICollection<CustomerOrder> CustomerOrders { get; set; }
    }
}

Add following code manually

namespace DataLayer
{
    [MetadataType(typeof(CustomerMetaData))]
    public partial  class Customer
    {

    }
    public class CustomerMetaData
    {
        [StringLength(10, ErrorMessage = "First name must be 25 characters or less in length.")]
        [Required(ErrorMessage = "First name is required.")]
        public String FirstName { get; set; }
    }
}
like image 102
Rakesh Nandrajog Avatar answered Oct 19 '22 23:10

Rakesh Nandrajog


Okay, here is the answer.

The trick is, the auto-generated classes are all partial classes. The compilation process will combine all partial classes with the same name.

If we have public partial class Concept generated by DbContext, all we need to do is to create another one started with public partial class Concept. This new partial class can be created in a different folder, but we need to its namespace should be updated into the same as the auto-generated partial class.

In this newly created partial class, we can add all kinds of data-annotations such as

[Required(ErrorMesssage="This Field is required")]

Or, we can even add new properties like

FullName {get {return string.Format("{0} {1}", FirstName, LastName);}}

If the model is updated from the database again, only the auto-generated partial classes will be updated. Those newly manually added partial classes, which contain our annotations and other manipulations will remain intact.

like image 21
Blaise Avatar answered Oct 19 '22 22:10

Blaise