Entity Framework使用DbModelBuilder API创建表结构

 更新时间:2022年03月03日 11:24:27   作者:.NET开发菜鸟  
这篇文章介绍了Entity Framework使用DbModelBuilder API创建表结构的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

DbContext类有一个OnModelCreating方法,它用于流利地配置领域类到数据库模式的映射。下面我们以fluent API的方式来定义映射。
首先,先将Product类注释掉,重新编写该类,重新编写后的Product类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFFluentAPI.Model
{
    public class Product
    {
        public int ProductNo { get; set; }

        public string ProductName { get; set; }

        public double ProductPrice { get; set; }
    }
}

然后在数据库上下文Context类中的OnModelCreating方法中使用fluent API来定义Product表的数据库模式:

using EFFluentAPI.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFFluentAPI.EFContext
{
    public class Context:DbContext
    {
        public Context()
            : base("DbConnection")
        { }

        public DbSet<Product> Products { get; set; }

        /// <summary>
        /// 重新OnModelCreating方法
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //映射到表Product,ProductNo和ProductName作为复合主键
            modelBuilder.Entity<Product>().ToTable("Product").HasKey(p=>new {p.ProductNo,p.ProductName});
            //ProductNo映射到数据表中的列名是Id
            modelBuilder.Entity<Product>().Property(p => p.ProductNo).HasColumnName("Id");
            modelBuilder.Entity<Product>().Property(p => p.ProductName)
                .IsRequired() //设置ProductName是必须的,即不能为null,默认是可以为null的
                .IsUnicode()  //设置ProductName列为Unicode字符,实际上默认就是Unicode字符,所以该方法可以不写。
                .HasMaxLength(10); //设置ProductName列的最大长度是10
            base.OnModelCreating(modelBuilder);
        }
    }
}

modelBuilder.Entity<Product>()会得到EntityTypeConfiguration类的一个实例。此外,使用fluent API的一个重要决定因素是我们是否使用了外部的POCO类,即实体模型类是否来自一个类库。我们无法修改类库中类的定义,所以不能通过数据注解来提供映射细节。这种情况下,我们必须使用fluent API。

什么是POCO?

POCO是指Plain Old Class Object,也就是最基本的CLR Class,在原先的EF中,实体类通常是从一个基类继承下来的,而且带有大量的属性描述。而POCO则是指最原始的Class,换句话说这个实体的Class仅仅需要从Object继承即可,不需要从某一个特定的基类继承。主要是配合Code First使用。Code First则是指我们先定义POCO这样的实体Class,然后生成数据库。实际上现在也可以使用Entity Framweork Power tools将已经存在的数据库反向生成POCO的Class(不通过edmx文件)。

程序运行后创建的数据库如下图所示:

到此这篇关于Entity Framework使用DbModelBuilder API创建表结构的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 列举ASP.NET页面之间传递值的几种方式

    列举ASP.NET页面之间传递值的几种方式

    这篇文章主要介绍了列举ASP.NET 页面之间传递值的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • NET NativeAOT 用法指南

    NET NativeAOT 用法指南

    NativeAOT 是 .NET 中一个非常棒和强大的工具,有了 NativeAOT,你可以以可预测的性能构建你的应用,同时节省资源(更低的内存占用和更小的二进制大小),本文介绍NET NativeAOT 指南,感兴趣的朋友一起看看吧
    2024-02-02
  • .NET使用System.Timers.Timer类实现程序定时执行

    .NET使用System.Timers.Timer类实现程序定时执行

    这篇文章介绍了.NET使用System.Timers.Timer类实现程序定时执行的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • .net core项目中常用的几款类库详解(值得收藏)

    .net core项目中常用的几款类库详解(值得收藏)

    这篇文章主要给大家介绍了关于.net core项目中常用的几款类库的相关资料,文章通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • LiteralControl ASP.NET中的另类控件

    LiteralControl ASP.NET中的另类控件

    对于LiteralControl控件的应用比较少,今天突然看到了,就弄个明白为好,所以总结出来,供大家一起学习
    2012-01-01
  • Coolite Cool Study 3 MVC + Coolite 的实现代码

    Coolite Cool Study 3 MVC + Coolite 的实现代码

    啊,开始以为MVC+Coolite结合的例子没什么难度,但原来Coolite在MVC中需要特定设置一下某些属性才行,费了两个小时才算大功告成,具体请看下文。还是先把这个例子的效果贴上来再说。
    2009-05-05
  • asp.net Server.MapPath方法注意事项

    asp.net Server.MapPath方法注意事项

    当我发布之后,对存储图片的文件夹创建了虚拟目录,并赋予该目录写入的权限,但是,当我上传图片的时候,总是失败。以前没遇到过这种情况,觉得很是怪异,所以想尽办法去解决。
    2008-09-09
  • asp.net替换和恢复html特殊字符

    asp.net替换和恢复html特殊字符

    替换html中的特殊字符需要进行替换的文本。替换完的文本。
    2008-05-05
  • ASP.net连接Excel的代码

    ASP.net连接Excel的代码

    ASP.net连接Excel的代码,这个是asp.net操作excel必须知道的基础,另外的技巧可以参考脚本之家之前发布的文章。
    2010-03-03
  • asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)

    asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware

    以下代码中所注释的部分是所改版的地方。:) Krystalware.SlickUpload.dll
    2009-05-05

最新评论