In the Code First method, you can also use Fluent APIs to process ing between entities and data tables.
To use the Fluent API, you must override the OnModelCreating method when constructing a custom DbContext. In this method, the Fluent API is called.
As shown in the following code:
Publicclass BlogDbContext: DbContext
{
Public BlogDbContext ()
: Base ("name = BlogDB2005 ")
{
}
Protectedoverridevoid OnModelCreating (DbModelBuilder modelBuilder)
{
// Do something
Base. OnModelCreating (modelBuilder );
}
}
Here are some simple examples.
Primary Key
ModelBuilder. Entity <BlogUser> (). HasKey (user => user. UserId );
Joint primary key
// Federated primary key
ModelBuilder. Entity <BlogUser> (). HasKey (user => new {user. UserId, user. BlogName });
The field is not empty.
// Required attribute
ModelBuilder. Entity <BlogUser> (). Property (user => user. BlogName). IsRequired ();
Set the maximum field length
ModelBuilder. Entity <BlogUser> (). Property (user => user. BlogName). HasMaxLength (20 );
Set complex attributes. ComplexType is equivalent
ModelBuilder. ComplexType <Address> ();
Attribute fields are not mapped to data table fields, which is equivalent to NotMapped in data characteristics.
ModelBuilder. Entity <BlogUser> (). Ignore (user => user. MyProperty );
Set whether the field is automatically increased
// Set Automatic growth. If Automatic growth is not required, set it to DatabaseGeneratedOption. None.
ModelBuilder. Entity <BlogUser> (). Property (user => user. UserId)
. HasDatabaseGeneratedOption (DatabaseGeneratedOption. Identity );
Set Foreign keys
/// Generate a one-to-many relationship
ModelBuilder. Entity <Post> ()
. HasRequired (p => p. BlogUser)
. WithMany (user => user. Posts)
. HasForeignKey (p => p. UserId );
/// Equivalent to the above
// ModelBuilder. Entity <BlogUser> ()
//. HasMany (user => user. Posts)
//. WithRequired (p => p. BlogUser)
//. HasForeignKey (p => p. UserId );
Set the table name mapped to the database.
ModelBuilder. Entity <BlogUser> (). ToTable ("MyUser ");
Set the name of the column mapped to the object property in the database.
ModelBuilder. Entity <BlogUser> ()
. Property (user => user. Description)
. HasColumnName ("userDescription ")
. HasColumnType ("ntext ");
The complete code is provided below to facilitate testing:
Class FluentAPISample
{
Staticvoid Main (string [] args)
{
Using (var db = new BlogDbContext ())
{
Db. Database. Create ();
}
}
}
Publicclass BlogDbContext: DbContext
{
Public BlogDbContext ()
: Base ("name = BlogDB2005 ")
{
Database. SetInitializer <BlogDbContext> (
New DropCreateDatabaseIfModelChanges <BlogDbContext> ()
);
}
Protectedoverridevoid OnModelCreating (DbModelBuilder modelBuilder)
{
ModelBuilder. Entity <BlogUser> (). HasKey (user => user. UserId );
// Federated primary key
// ModelBuilder. Entity <BlogUser> (). HasKey (user => new {user. UserId, user. BlogName });
// Set Automatic growth. If Automatic growth is not required, set it to DatabaseGeneratedOption. None.
ModelBuilder. Entity <BlogUser> (). Property (user => user. UserId)
. HasDatabaseGeneratedOption (DatabaseGeneratedOption. Identity );
// Required attribute
ModelBuilder. Entity <BlogUser> (). Property (user => user. BlogName). IsRequired ();
ModelBuilder. Entity <BlogUser> (). Property (user => user. BlogName). HasMaxLength (20 );
ModelBuilder. Entity <BlogUser> (). Ignore (user => user. MyProperty );
ModelBuilder. ComplexType <Address> ();
/// Generate a one-to-many relationship
ModelBuilder. Entity <Post> ()
. HasRequired (p => p. BlogUser)
. WithMany (user => user. Posts)
. HasForeignKey (p => p. UserId );
/// Equivalent to the above
// ModelBuilder. Entity <BlogUser> ()
//. HasMany (user => user. Posts)
//. WithRequired (p => p. BlogUser)
//. HasForeignKey (p => p. UserId );
ModelBuilder. Entity <BlogUser> (). ToTable ("MyUser ");
ModelBuilder. Entity <BlogUser> ()
. Property (user => user. Description)
. HasColumnName ("userDescription ")
. HasColumnType ("ntext ");
Base. OnModelCreating (modelBuilder );
}
}
Publicpartialclass BlogUser
{
Publicint UserId {get; set ;}
Publicstring BlogName {get; set ;}
Publicint MyProperty {get; set ;}
Public Address {get; set ;}
Publicstring Description {get; set ;}
Publicvirtual ICollection <Post> Posts {get; set ;}
}
Publicpartialclass Post
{
Publicint PostId {get; set ;}
Publicstring PostTitle {get; set ;}
Publicint UserId {get; set ;}
Public BlogUser {get; set ;}
}
Publicpartialclass Address
{
Publicstring Province {get; set ;}
Publicstring City {get; set ;}
}
The running result is shown as follows: