OurDotNetLogo

ADO.NET,EF,EntityFramework,OurDotNet,ADO.NET,EF,EntityFramework,OurDotNet

EF Code First 约定
作者:Gyoung  |   2017/12/26 23:13:05   |  阅读:554

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

主键:KEY

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

[Key]
public int DestinationId { get; set; }

FluentAPI

public class BreakAwayContext : DbContext
    {
        public DbSet<Destination> Destinations { get; set; }
        public DbSet<Lodging> Lodgings { get; set; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //Fluent API
            modelBuilder.Entity<Destination>().HasKey(d => d.DestinationId);
            base.OnModelCreating(modelBuilder);
        }
    } 

外键

DataAnnotations

        public int DestinationId { get; set; }
        [ForeignKey("DestinationId")]
        public Destination Destination { get; set; }

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

FluentAPI

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

长度

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

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

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

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

非空

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

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

FluentAPI:

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

数据类型

DataAnnotationsTypeName

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

FluentAPI:

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

表名

DataAnnotationsTable

[Table("MyLodging")]
    public class Lodging
    {
        public int LodgingId { get; set; }
        public string Name { get; set; }
        public string Owner { get; set; }    
        public decimal Price { get; set; }
        public bool IsResort { get; set; }
        public Destination Destination { get; set; }
 
    } 

FluentAPI:

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

列名

DataAnnotationsColumn

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

FluentAPI:

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

自增长

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

DataAnnotationsDatabaseGenerated

  public class Person
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid SocialId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

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

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

FluentAPI:

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

忽略列映射

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

DataAnnotationsNotMapped

        [NotMapped]
        public string Name
        {
            get 
            {
                return FirstName + " " + LastName;
            }
        }

FluentAPI:NotMapped

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

忽略表映射

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

DataAnnotations

 [NotMapped]
    public class Person
    {
        [Key]
        public Guid SocialId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

FluentAPI:

modelBuilder.Ignore<Person>();

时间戳

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

DataAnnotationsTimestamp

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

FluentAPI:

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

复杂类型

DataAnnotationsComplexType

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

FluentAPI:

modelBuilder.ComplexType<Address>();

相关复杂类型的介绍,可以参考http://www.ourdotnet.com/News/Index/58


评论:

发表评论

最新评论:


圈内热点

  • 怎么轻松学习JavaScript

    js给初学者的印象总是那么的“杂而乱”,相信很多初学者都在找轻松学习js的途径。我试着总结自己学习多年js的经验,希望能给后来的学习者探索出一条“轻松学习js之路”。

  • 我心目中的ASP.NET核心对象

    在我的眼里,Asp.net有三大核心对象:HttpContext, HttpRequest, HttpResponse。除此之外,还有二个对象虽然称不上核心,但仍然比较重要:HttpRuntime,HttpServerUtility

  • IIS内部运行机制

    这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5、IIS6、IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP.NET的底层机制并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解

  • 改善程序员生活质量的3+10习惯

    2017年的一天,代码伴随着手指极具节奏感地输出在IDE上,突然某Chrome插件弹出一封邮件提示:“今天是我在ThoughtWorks的最后一天”。

  • 编程的一些伟大真理

    编程学习中的一些伟大真理,初级程序员都知道吗?

回到顶部