Code First Approach

From Logic Wiki
Revision as of 13:27, 9 May 2016 by Dt1nh6 (Talk | contribs) (1 revision imported)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


♠ if you don't use data in startup page you can't see data tables as created. (it took 6 hours) 
♠ Code First includes derived classes even if only base class is defined as DbSet property. 
♠ (you don't need to add them to dbset if you create them with foreign keys)
♠ The default convention for primary key is that Code First would create a primary key 
♠ for a property if the property name is Id or <class name>Id (NOT case sensitive).


Install-Package EntityFramework -Pre -Version 6.0.0

in Model Folder Create Student.cs class

using System; 
using System.Collections.Generic;  
namespace ContosoUniversity.Models 
{
   public class Student 
   { 
     public int ID { get; set; } 
     public string LastName { get; set; } 
     public string FirstMidName { get; set; } 
     public DateTime EnrollmentDate { get; set; }  
     public virtual ICollection<Enrollment> Enrollments { get; set; } 
   } 
 }

in Model Folder Create Enrollment.cs class

namespace ContosoUniversity.Models 
{     
   public enum Grade     
   {         
     A, B, C, D, F     
   } 

   public class Enrollment     
   {         
     public int EnrollmentID { get; set; }
     public int CourseID { get; set; }
     public int StudentID { get; set; }
     public Grade? Grade { get; set; }
     public virtual Course Course { get; set; }
     public virtual Student Student { get; set; }     
   } 
} 

in Model Folder Create Course.cs class

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations.Schema;
  
namespace ContosoUniversity.Models 
{     
  public class Course     
  {         
     [DatabaseGenerated(DatabaseGeneratedOption.None)]         
     public int CourseID { get; set; }   
     public string Title { get; set; }
     public int Credits { get; set; }
     public virtual ICollection<Enrollment> Enrollments { get; set; }     
   } 
}

Create a folder in root as DAL Create BackOfficeContext.cs file in DAL

using ContosoUniversity.Models; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration.Conventions;  

namespace ContosoUniversity.DAL 
{     
   public class SchoolContext : DbContext     
   {              
     public SchoolContext() : base("SchoolContext")         {         
   }          
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }

   protected override void OnModelCreating(DbModelBuilder modelBuilder)         
   {             
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();         
   }     
  } 
}   

Create a file named BackOfficeInitializer.cs in DAL folder

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.Entity; 
using ContosoUniversity.Models;
 
namespace ContosoUniversity.DAL 
{     
  public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>     
  {         
     protected override void Seed(SchoolContext context)
     {             
       var students = new List<Student>
       {

        //---------------------------------------------------------------------------------------------------------
        // I think the correct syntax is this one below (ALI)
        //---------------------------------------------------------------------------------------------------------
         new Student{) {FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Pa rse("2005-09-01")},         
        //---------------------------------------------------------------------------------------------------------

         new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Pa rse("2005-09-01")},             
         new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Par se("2002-09-01")},             
         new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse( "2003-09-01")},             
         new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Par se("2002-09-01")}, 
         new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002- 09-01")},             
         new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse ("2001-09-01")},             
         new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse( "2003-09-01")},             
         new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse ("2005-09-01")}             
        };  
        students.ForEach(s => context.Students.Add(s));
        context.SaveChanges();             

        var courses = new List<Course>             
        {             
           new Course{CourseID=1050,Title="Chemistry",Credits=3,},             
           new Course{CourseID=4022,Title="Microeconomics",Credits=3,},     
           new Course{CourseID=4041,Title="Macroeconomics",Credits=3,},   
           new Course{CourseID=1045,Title="Calculus",Credits=4,},             	
           new Course{CourseID=3141,Title="Trigonometry",Credits=4,},          
           new Course{CourseID=2021,Title="Composition",Credits=3,},   
           new Course{CourseID=2042,Title="Literature",Credits=4,}             
         };
         courses.ForEach(s => context.Courses.Add(s));  
         context.SaveChanges();             
         var enrollments = new List<Enrollment>             
         {             
         new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},     
         new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},        
         new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},     
         new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},    	  
         new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},      
         new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},      
         new Enrollment{StudentID=3,CourseID=1050},             
         new Enrollment{StudentID=4,CourseID=1050,},             
         new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},           
         new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},      
         new Enrollment{StudentID=6,CourseID=1045},             
         new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},             
       };             
       enrollments.ForEach(s => context.Enrollments.Add(s));     
       context.SaveChanges();         
       }     
     } 
 } 


in Web.Config file...

<entityFramework>   
   <contexts>     
     <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">  
       <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />     
     </context>   
   </contexts>   
   <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">     
     <parameters>       
       <parameter value="v11.0" />     
     </parameters>   
   </defaultConnectionFactory>   
   <providers>     
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />   
     </providers> 
   </entityFramework>

And Again in web.config file

<connectionStrings>     
  <add name="SchoolContext" connectionString="AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf;Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

<appSettings>   
  <add key="webpages:Version" value="3.0.0.0" />   
  <add key="webpages:Enabled" value="false" />   
  <add key="ClientValidationEnabled" value="true" />   
  <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings>

The model backing the context has changed since the database was created Problem

in Global.asax

using System.Data.Entity;
using LogicBO.DAL;
using LogicBO.Models;
......       
protected void Application_Start()
{ 
Database.SetInitializer<BoContext>(new DropCreateDatabaseIfModelChanges<BoContext>());

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties

.Where(q => DbFunctions.TruncateTime(q.DateStart) >= DateTime.Now.Date)