分享

【Entity Framework Code First教程】约定配置

 贾朋亮博客 2014-03-23
要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一 个就是Fluent API,通过新增相应的配置类来覆盖默认配置。现在我们用这两个来对比了解EF中的约定配置。

主键:KEY

Data Annotations:通过Key关键字来标识一个主键

  1. [Key] 
  2. public int DestinationId { getset; } 

Fluent API:

  1. public class BreakAwayContext : DbContext 
  2.     { 
  3.         public DbSet<Destination> Destinations { getset; } 
  4.         public DbSet<Lodging> Lodgings { getset; } 
  5.  
  6.         protected override void OnModelCreating(DbModelBuilder modelBuilder) 
  7.         { 
  8.             //Fluent API 
  9.             modelBuilder.Entity<Destination>().HasKey(d => d.DestinationId); 
  10.             base.OnModelCreating(modelBuilder); 
  11.         } 
  12.     } 

外键

Data Annotations:

  1. public int DestinationId { getset; } 
  2. [ForeignKey("DestinationId")] 
  3. public Destination Destination { getset; } 

 

注意,指定列名存在,如上面的DestinationId,则类中必须存在名称为DestinationId的属性。

Fluent API:

modelBuilder.Entity<Lodging>().HasRequired(p => p.Destination).WithMany(p=>p.Lodgings).HasForeignKey(p => p.DestinationId);

长度

Data Annotations:通过StringLength(长度),MinLength(最小长度),MaxLength(最大长度)来设置数据库中字段的长度。

        [MinLength(10),MaxLength(30)]
        public string Name { get; set; }
        [StringLength(30)]
        public string Country { get; set; }

Fluent API:没有设置最小长度这个方法。

modelBuilder.Entity<Destination>().Property(p => p.Name).HasMaxLength(30);
            modelBuilder.Entity<Destination>().Property(p => p.Country).HasMaxLength(30);

非空

Data Annotations:用Required来标识,还可以设置是否可允许空字符串,显示错误消息等。

        [Required]
        public string Country { get; set; }
        [Required(ErrorMessage="请输入描述")]
        public string Description { get; set; }

Fluent API:

modelBuilder.Entity<Destination>().Property(p => p.Country).IsRequired();

数据类型

Data Annotations:TypeName

//将string映射成ntext,默认为nvarchar(max)
        [Column(TypeName = "ntext")]
        public string Owner { get; set; }

Fluent API:

modelBuilder.Entity<Lodging>().Property(p => p.Owner).HasColumnType("ntext");


表名

Data Annotations:Table

  1. [Table("MyLodging")] 
  2.     public class Lodging 
  3.     { 
  4.         public int LodgingId { getset; } 
  5.         public string Name { getset; } 
  6.         public string Owner { getset; }     
  7.         public decimal Price { getset; } 
  8.         public bool IsResort { getset; } 
  9.         public Destination Destination { getset; } 
  10.  
  11.     } 

Fluent API:

modelBuilder.Entity<Lodging>().ToTable("MyLodging");

列名

Data Annotations:Column

[Column("MyName")]
public string Name { get; set; }

Fluent API:

modelBuilder.Entity<Lodging>().Property(p => p.Name).HasColumnName("MyName");

自增长

如果主键是int类型,EF为默认设置为增长。但如果是GUID类型,则要显示的设置自增长。

Data Annotations:DatabaseGenerated

  1. public class Person 
  2.     { 
  3.         [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
  4.         public Guid SocialId { getset; } 
  5.         public string FirstName { getset; } 
  6.         public string LastName { getset; } 
  7.     } 

看看创建数据的脚本,会加一句

ALTER TABLE [dbo].[People] ADD  DEFAULT (newid()) FOR [SocialId]

Fluent API:

modelBuilder.Entity<Person>().Property(p => p.SocialId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

忽略列映射

类中有些属性,特别是一些通过计算或合并列得出的结果,我们并不需要其记录到数据库中,就可以通过配置不让它生成在数据库中。

Data Annotations:NotMapped

  1. [NotMapped] 
  2.         public string Name 
  3.         { 
  4.             get  
  5.             { 
  6.                 return FirstName + " " + LastName; 
  7.             } 
  8.         } 

Fluent API:NotMapped

modelBuilder.Entity<Person>().Ignore(p => p.Name);

忽略表映射

对于不需要映射到数据库中的表,我们也可以取消其映射。

Data Annotations:

  1. [NotMapped] 
  2.     public class Person 
  3.     { 
  4.         [Key] 
  5.         public Guid SocialId { getset; } 
  6.         public string FirstName { getset; } 
  7.         public string LastName { getset; } 
  8.     } 

Fluent API:

modelBuilder.Ignore<Person>();

时间戳

时间戳只对数据类型为byte[]的属性有效,并且一个类中只能有一个设置为时间戳的属性。

Data Annotations:Timestamp

    [Timestamp]
    public Byte[] TimeStamp { get; set; }

Fluent API:

modelBuilder.Entity<Lodging>().Property(p => p.TimeStamp).IsRowVersion();

复杂类型

Data Annotations:ComplexType

 [ComplexType]
    public class Address
    {
        public string Country { get; set; }
        public string City { get; set; }
    }

Fluent API:

modelBuilder.ComplexType<Address>();

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多