Home > Database > Mysql Tutorial > 学习EF之CodeFirst二(数据库对应映射)

学习EF之CodeFirst二(数据库对应映射)

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-07 15:11:09
Original
1623 people have browsed it

一: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>
Copy after login

假如我们代码没有按照上面规定来便会报出异常:
学习EF之CodeFirst二(数据库对应映射)

上面只是列出一部分的特性,其它特性可以查MSDN:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx

学习EF之CodeFirst二(数据库对应映射)

学习EF之CodeFirst二(数据库对应映射)

学习EF之CodeFirst二(数据库对应映射)

 

二: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></car></home></person></person></home></home>
Copy after login

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></home>
Copy after login

<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></person>
Copy after login

然后修改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></car></home></person>
Copy after login

下面是一些常用的设置:

<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>();</address></lodging></person></person></person></lodging></lodging></lodging></destination></destination></destination></lodging></destination>
Copy after login

 

 

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template