Friday, December 28, 2012

How to Use Entity Framework Fluent API ?

How to Change Entity Framework Default Conventions, when Mapping Data ?

There are 3 ways.

1. Entity Framework Fluent API

2. Fluent Validation
       - Validation Library for .NET
       - This uses a fluent interface and lambda expressions for building validation rules
          for your business objects

3. Data Annotations 
          - Annotations only cover a subset of the Fluent Validation functionality


Entity Framework Fluent API

       
What is Entity Framework Fluent API ?
  • When working with Entity Framework Code First the default behavior is to map your POCO classes to tables using a set of conventions baked into Entity Framework
  • Sometimes, however you cannot or do not want to follow those conventions and need to map entities to something other than what the conventions dictate
  • For such a scenario you can use Fluent API
  • Can be Used Only with Code First Development
  • This is used to define the mapping between your objects and the database

What Does Fluent API  do ?
  • The Code First Fluent API is most commonly accessed by overriding the OnModelCreating method on your derived DbContext class

Which Tasks can be Achieved by using Fluent API ?

1. Property Mapping

2. Type Mapping

3. Configuring Relationships

On This Article I will explain Property Mapping with Fluent API.  

Article's Sample Code Here

1. Property Mapping

    - is used to configure attributes for each property belonging to an entity or complex type
    - is used to obtain a configuration object for a given property
    - the options on the configuration object are specific to the type being configured
                 e.g. IsUnicode is available only on string properties 

  • How to Configure a Primary Key ?
          - The HasKey method is used to configure the InstructorID primary key on the
             OfficeAssignment type

       modelBuilder.Entity<OfficeAssignment>().HasKey(t => t.InstructorId);

  • How to Configure a Composite Primary Key ?
         - DepartmentId and Name properties to be the composite primary key of the
           Department type

      modelBuilder.Entity<Department>()
           .HasKey(t => new { t.DepartmentId, t.Name });

  • How to Switch off Identity for Numeric Primary Keys ?
         - DepartmentId property value will not be generated by the database

      modelBuilder.Entity<Department>()
          .Property(t => t.DepartmentId)
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

  • How to Specify the Maximum Length on a Property ?
         - Name property should be no longer than 50 characters

         - If you make the value longer than 50 characters, you will get a 
            DbEntityValidationException exception

         - If Code First creates a database from this model it will also set the
            maximum length of the Name column to 50 characters 

      modelBuilder.Entity<Department>().Property(t => t.Name).HasMaxLength(50);

  • How to Configure the Property to be Required ?
         - Name property is required

         - If you do not specify the Name, you will get a 
            DbEntityValidationException exception

         - If Code First creates a database from this model then the column used to store
            this property will be non-nullable

      modelBuilder.Entity<Department>().Property(t => t.Name).IsRequired(); 

  • How to Specify Not to Map a CLR Property to a Column in the Database ?

      modelBuilder.Entity<Department>().Ignore(t => t.Budget);

  • How to Map a CLR Property to a Specific Column in the Database ?

          - Maps the Name CLR property to the DepartmentName database column

       modelBuilder.Entity<Department>()
                .Property(t => t.Name)
                .HasColumnName("DepartmentName");

  • How to Rename a Foreign Key That Is Not Defined in the Model ?
          - If you choose not to define a foreign key on a CLR type,
          - But want to specify what name it should have in the database

       modelBuilder.Entity<Course>()
          .HasRequired(c => c.Department)
          .WithMany(t => t.Courses)
          .Map(m => m.MapKey("ChangedDepartmentId"));

  • How to Configure whether a String Property Supports Unicode Content ?
          - By default strings are Unicode (nvarchar in SQL Server)
          - You can use the IsUnicode method to specify that a string should be of varchar type

      modelBuilder.Entity<Department>().Property(t => t.Name).IsUnicode(false);

  • How to Configure the Data Type of a Database Column ?
         - The HasColumnType method enables mapping to different representations
            of the same basic type

         - Using this method does not enable you to perform any conversion
            of the data at run time

         - Note that : IsUnicode is the preferred way of setting columns to varchar,
            as it is database agnostic

     modelBuilder.Entity<Department>()
                 .Property(p => p.Name)
                 .HasColumnType("varchar");

  • How to Configure Properties on a Complex Type ?

         Way 1 : You can call Property on ComplexTypeConfiguration

       modelBuilder.ComplexType<Details>()
                   .Property(t => t.Location)
                   .HasMaxLength(20);

        Way 2 : You can also use the dot notation to access a property of a complex type

       modelBuilder.Entity<OnsiteCourse>()
            .Property(t => t.Details.Location)
            .HasMaxLength(20);

  • How to Configure a Property to Be Used as an Optimistic Concurrency Token ?

       Way 1 : You can use either the ConcurrencyCheck attribute
                     or the IsConcurrencyToken method

      modelBuilder.Entity<OfficeAssignment>()
                  .Property(t => t.Timestamp)
                  .IsConcurrencyToken();

      Way 2 : You can also use the IsRowVersion method

     modelBuilder.Entity<OfficeAssignment>()
                 .Property(t => t.Timestamp)
                 .IsRowVersion();
Conclusion
  • You can use Fluent API with Code First development, when you want to override the default conventions maintained by the Entity Framework
  • I will explain Type Mapping and Configuring Relationships with my future Blog Post
  • So Try This and Enjoy it

I hope this helps to You.Comments and feedback greatly appreciated.

Happy Coding

Articles You Might Like

Stay Tuned: I'll be Back with Type Mapping and Configuring Relationships

18 comments:

  1. likes this.

    -Nikhil Tewari-

    ReplyDelete
  2. likes this.

    -Atul Setu-

    ReplyDelete
  3. This is great Sampath.. and thanks for sending me the link through LinkedIn.

    ReplyDelete
  4. Sampath keep write like these great Articles.. Very useful man....

    ReplyDelete
    Replies
    1. Hi Mohammed,

      Thanks for your appreciation.
      Do Keep in Touch.

      Delete
  5. Thanking you dear friend Sampath...!

    -Muhammed Nuzly-

    ReplyDelete
  6. I am not familiar with Entity framework. This is a good kickstart.
    Thanks to author.

    ReplyDelete
    Replies
    1. Hi Mukesh,

      Thanks for your feedback.
      Do Keep in Touch.

      Delete
  7. Hi, these stuff will be useful for me someday. Bookmarked up. Keep going.

    ReplyDelete
    Replies
    1. Hi Rasan,

      Thanks for your Comment.
      Do Keep in Touch.

      Delete
  8. Hey Sampath thats nice article.!!!!

    ReplyDelete
    Replies
    1. Hi Utkarsh,

      Thanks, I’m glad you enjoyed it ! :)

      Delete

Thanks for your Feedback.