一:data annotations 此方法是利用在实体的那个属性里增加特性来进行操作控制;这些特性是在using System.ComponentModel.DataAnnotations下,要引用DLL using System.ComponentModel.DataAnnotations; namespace ModelLib{ public class Car { [Key] publi
一:data annotations
此方法是利用在实体的那个属性里增加特性来进行操作控制;这些特性是在using System.ComponentModel.DataAnnotations下,要引用DLL
<span>using</span><span> System.ComponentModel.DataAnnotations;
</span><span>namespace</span><span> ModelLib
{
</span><span>public</span> <span>class</span><span> Car
{
[Key]
</span><span>public</span> <span>int</span> ID { <span>get</span>; <span>set</span><span>; }
[Required(ErrorMessage</span>=<span>"</span><span>不能为空</span><span>"</span><span>)]
</span><span>public</span> <span>string</span> CarNum { <span>get</span>; <span>set</span><span>; }
[StringLength(</span><span>10</span>,ErrorMessage=<span>"</span><span>最大长度不能超过10个字符</span><span>"</span><span>)]
</span><span>public</span> <span>string</span> Colour { <span>get</span>; <span>set</span><span>; }
[Range(</span><span>1</span>,<span>10</span>,ErrorMessage=<span>"</span><span>UserYear取证范围在1-10之间</span><span>"</span><span>)]
</span><span>public</span> <span>int</span> UserYear { <span>get</span>; <span>set</span><span>; }
[RegularExpression(</span><span>@"</span><span>^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$</span><span>"</span><span>)]
</span><span>public</span> <span>string</span> Email { <span>get</span>; <span>set</span><span>; }
}
}</span>假如我们代码没有按照上面规定来便会报出异常:
上面只是列出一部分的特性,其它特性可以查MSDN:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx



二:Fluent API(推荐使用,因为前一种范围有限)
1:我们可以在EF上下文里重写OnModelCreating然后对要设置的属性进行操作,但是这样一个实体类如果有3个属性需要配置,10个实体类就需要配置30个,那么就得在OnModelCreating方法里写30行,很麻烦且不易维护,所以一般不这么编写;
<span>using</span><span> System.Data.Entity;
</span><span>using</span><span> ModelLib;
</span><span>namespace</span><span> DataLibrary
{
</span><span>public</span> <span>class</span><span> MyDbContext : DbContext
{
</span><span>public</span><span> MyDbContext()
: </span><span>base</span>(<span>"</span><span>name=MyTestDb</span><span>"</span><span>)
{
}
</span><span>protected</span> <span>override</span> <span>void</span><span> OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity</span><Home>().HasKey(d =><span> d.ID);
modelBuilder.Entity</span><Home>().Property(d =><span> d.Address).IsRequired();
modelBuilder.Entity</span><Person>().Property(p => p.PassWord).HasMaxLength(<span>50</span><span>);
}
</span><span>public</span> DbSet<Person> Person { <span>get</span>; <span>set</span><span>; }
</span><span>public</span> DbSet<Home> Home { <span>get</span>; <span>set</span><span>; }
</span><span>public</span> DbSet<Car> Car { <span>get</span>; <span>set</span><span>; }
}
}</span>2:注意返回值可以看出modelBuilder的Entity泛型方法的返回值是EntityTypeConfiguration泛型类。我们可以定义一个继承自EntityTypeConfiguration泛型类的类来定义domain中每个类的数据库配置。
ok,我们在DataAccess类库下新建一个继承自EntityTypeConfiguration泛型类的DestinationMap类,在构造函数里写上配置:
<span>using</span><span> System.Data.Entity.ModelConfiguration;
</span><span>using</span><span> System.Linq;
</span><span>using</span><span> System.Text;
</span><span>using</span><span> ModelLib;
</span><span>namespace</span><span> DataLibrary
{
</span><span>public</span> <span>class</span> HomeMap:EntityTypeConfiguration<Home><span>
{
</span><span>public</span><span> HomeMap()
{
Property(d </span>=><span> d.Address).IsRequired();
}
}
}</span>
<span>using</span><span> System.Data.Entity.ModelConfiguration;
</span><span>using</span><span> System.Linq;
</span><span>using</span><span> System.Text;
</span><span>using</span><span> ModelLib;
</span><span>namespace</span><span> DataLibrary
{
</span><span>public</span> <span>class</span> PersonMap:EntityTypeConfiguration<Person><span>
{
</span><span>public</span><span> PersonMap()
{
Property(d </span>=><span> d.Age).IsRequired();
}
}
}</span>然后修改EF上下文:
<span>using</span><span> System.Data.Entity;
</span><span>using</span><span> ModelLib;
</span><span>namespace</span><span> DataLibrary
{
</span><span>public</span> <span>class</span><span> MyDbContext : DbContext
{
</span><span>public</span><span> MyDbContext()
: </span><span>base</span>(<span>"</span><span>name=MyTestDb</span><span>"</span><span>)
{
}
</span><span>protected</span> <span>override</span> <span>void</span><span> OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(</span><span>new</span><span> HomeMap());
modelBuilder.Configurations.Add(</span><span>new</span><span> PersonMap());
}
</span><span>public</span> DbSet<Person> Person { <span>get</span>; <span>set</span><span>; }
</span><span>public</span> DbSet<Home> Home { <span>get</span>; <span>set</span><span>; }
</span><span>public</span> DbSet<Car> Car { <span>get</span>; <span>set</span><span>; }
}
}</span>下面是一些常用的设置:
<span>//</span><span>【主键】
</span><span>//</span><span>Data Annotations:</span>
<span>[Key]
</span><span>public</span> <span>int</span> DestinationId { <span>get</span>; <span>set</span><span>; }
</span><span>//</span><span>Fluent API:</span>
<span>public</span> <span>class</span><span> BreakAwayContext : DbContext
{
</span><span>protected</span> <span>override</span> <span>void</span><span> OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity</span><Destination>().HasKey(d =><span> d.DestinationId);
}
}
</span><span>//</span><span>【外键】
</span><span>//</span><span>Data Annotations:</span>
<span>public</span> <span>int</span> DestinationId { <span>get</span>; <span>set</span><span>; }
[ForeignKey(</span><span>"</span><span>DestinationId</span><span>"</span><span>)]
</span><span>public</span> Destination Destination { <span>get</span>; <span>set</span><span>; }
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Entity<Lodging>().HasRequired(p => p.Destination).WithMany(p=>p.Lodgings).HasForeignKey(p =><span> p.DestinationId);
</span><span>//</span><span>【长度】
</span><span>//</span><span>Data Annotations:通过StringLength(长度),MinLength(最小长度),MaxLength(最大长度)来设置数据库中字段的长度</span>
[MinLength(<span>10</span>),MaxLength(<span>30</span><span>)]
</span><span>public</span> <span>string</span> Name { <span>get</span>; <span>set</span><span>; }
[StringLength(</span><span>30</span><span>)]
</span><span>public</span> <span>string</span> Country { <span>get</span>; <span>set</span><span>; }
</span><span>//</span><span>Fluent API:没有设置最小长度这个方法</span>
modelBuilder.Entity<Destination>().Property(p => p.Name).HasMaxLength(<span>30</span><span>);
modelBuilder.Entity</span><Destination>().Property(p => p.Country).HasMaxLength(<span>30</span><span>);
</span><span>//</span><span>【非空】
</span><span>//</span><span>Data Annotations:</span>
[Required(ErrorMessage=<span>"</span><span>请输入描述</span><span>"</span><span>)]
</span><span>public</span> <span>string</span> Description { <span>get</span>; <span>set</span><span>; }
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Entity<Destination>().Property(p =><span> p.Country).IsRequired();
</span><span>//</span><span>【数据类型】</span>
<span>Data Annotations:
将string映射成ntext,默认为nvarchar(max)
[Column(TypeName </span>= <span>"</span><span>ntext</span><span>"</span><span>)]
</span><span>public</span> <span>string</span> Owner { <span>get</span>; <span>set</span><span>; }
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Entity<Lodging>().Property(p => p.Owner).HasColumnType(<span>"</span><span>ntext</span><span>"</span><span>);
</span><span>//</span><span>【表名】
</span><span>//</span><span>Data Annotations:</span>
[Table(<span>"</span><span>MyLodging</span><span>"</span><span>)]
</span><span>public</span> <span>class</span><span> Lodging
{
}
</span><span>//</span><span>Fluent API</span>
modelBuilder.Entity<Lodging>().ToTable(<span>"</span><span>MyLodging</span><span>"</span><span>);
</span><span>//</span><span>【列名】
</span><span>//</span><span>Data Annotations:</span>
[Column(<span>"</span><span>MyName</span><span>"</span><span>)]
</span><span>public</span> <span>string</span> Name { <span>get</span>; <span>set</span><span>; }
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Entity<Lodging>().Property(p => p.Name).HasColumnName(<span>"</span><span>MyName</span><span>"</span><span>);
</span><span>//</span><span>【自增长】
</span><span>//</span><span>Data Annotations</span>
<span>[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] Guid类型的主键、自增长
</span><span>public</span> Guid SocialId { <span>get</span>; <span>set</span><span>; }
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Entity<Person>().Property(p =><span> p.SocialId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
</span><span>//</span><span>【忽略列映射】
</span><span>//</span><span>Data Annotations:</span>
<span>[NotMapped]
</span><span>public</span> <span>string</span><span> Name
{
</span><span>get</span><span>
{
</span><span>return</span> FirstName + <span>"</span> <span>"</span> +<span> LastName;
}
}
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Entity<Person>().Ignore(p =><span> p.Name);
</span><span>//</span><span>【忽略表映射】
</span><span>//</span><span>Data Annotations:</span>
<span>[NotMapped]
</span><span>public</span> <span>class</span><span> Person
{ }
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Ignore<Person><span>();
</span><span>//</span><span>【时间戳】
</span><span>//</span><span>Data Annotations:Timestamp</span>
<span>1441598336
</span><span>public</span> Byte[] TimeStamp { <span>get</span>; <span>set</span><span>; } 只能是byte类型
</span><span>//</span><span>Fluent API:</span>
modelBuilder.Entity<Lodging>().Property(p =><span> p.TimeStamp).IsRowVersion();
</span><span>//</span><span>【复杂类型】
</span><span>//</span><span>Data Annotations:</span>
<span> [ComplexType]
</span><span>public</span> <span>class</span><span> Address
{
</span><span>public</span> <span>string</span> Country { <span>get</span>; <span>set</span><span>; }
</span><span>public</span> <span>string</span> City { <span>get</span>; <span>set</span><span>; }
}
</span><span>//</span><span>Fluent API:</span>
modelBuilder.ComplexType<Address>();
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号