mvc+EF

摘要:
---------------------------------------------------------------------数据库优先----------------------------------------------------------------------------这是一种以数据库为核心的传统开发模式。它更适合具有数据库DBA的团队,或者

---------------------------------------------------------------------数据库先行-------------------------------------------------------------------------------------

这种方式是比较传统的以数据库为核心的开发模式。比较适合有数据库DBA的团队、或者数据库已存在的情况。

优缺点:

1、优点:编辑代码最少的方式,在有完整的数据库的前提下,你几乎可以不编辑任何代码就能完成应用程序的数据层部分(EF)。

2、不够灵活,域模型结构完全由数据库控制生成,结构不一定合理;受数据库表和字段名影响,命名不规范。

创建步骤:1.在程序中新建DAL文件夹(或者单独创建DAL工程),

2.DAL文件夹点右键,选择添加->新建项。打开新建项界面,在界面中选择数据->ADO.NET实体数据模型。数据模型更名为TestEF.edmx,打开实体模型创建向导。

mvc+EF第1张

3.选择从数据库生成

4.选择数据库连接(没有可以新建一个),点下一步

mvc+EF第2张

5.可以选择所有的表、视图和存储过程和函数。

mvc+EF第3张

  可选的确定生成对象名称的单复数形式,选中后如果数据库表是负数形式,比如Books,创建的对应对象名就是Book,如果不选,则对应对象名是Books。

6.点击完成,生成EF的数据模型

mvc+EF第4张

mvc+EF第5张

7.测试代码

 static void Main(string[] args)
  {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Entities>());
            Contact con = new Contact
            {
                Name = "hht"
            };
            Contact con2 = new Contact
            {
                Name = "zhansan"
            };
            var list = new List<Contact>();
            list.Add(con);
            list.Add(con2);
            CGroup group = new CGroup
            {
                Contacts = list,
                GName = "Master Group"
            };
            using (Entities db = new Entities())
            {
                db.CGroups.Add(group);
                db.SaveChanges();
                foreach (CGroup item in db.CGroups)
                {
                    var cons = item.Contacts;
                    Console.WriteLine("Group:" + item.GName + "  have Contact " + cons.Count() + " 个");
                    db.CGroups.Remove(item);
                }
                db.SaveChanges();
            }
   }

输出结果

数据库

mvc+EF第6张

mvc+EF第7张

OK,插入数据成功

-----------------------------------------------------------------------代码先行---------------------------------------------------------------------------------------

Entity Framework:实体框架,看名字就知道是针对模型数据的。这是MS推出的一款ORM工具。

与NHibernate比较

1)Entity Framework封装性更好,增、删、改、查询更方便

2)  Entity Framework使用更方便的Linq to Entity查询,延迟加载(只有在需要时才加载,只加载需要的数据)。

3)开发效率很高,使用DBFirst几乎不用编辑什么代码就能生成一个简单、通用的应用程序。

水平有限,只是把最近关于Entity Framework学习的心得整理一下。供以后查询

第一步:安装Entity Framework

使用Nuget下载最新版的Entity Framework ;在项目上右键->管理Nuget程序包,打开Nuget程序包管理界面

mvc+EF第8张

搜索 Entity,找到最新版本Entity Framework,点击安装。(我的已经安装好了)

Code First-代码优先,先创建好领域模型。新建MyDbContext继承DbContext。根据代码自动生成数据库

Code First优点

1.可以自由的创建领域模型,基本不受EF框架的限制。自由的命名。程序员只需要关心对象间的关系。基本做到了与数据库的完全分离。

2.便于单元测试。不再使用绑定性较强的edmx文件。只使用普通的Model类

3.使用Fluent API映射可以自由的定义表名、字段名和关系。可控性强

4.可以方便的进行数据库迁移

用法

一、创建领域模型:新建Contact、CGroup、Address三个Model类

public class Contact
  {
        public int ID { get; set; }
        public string Name { get; set; }
        public System.DateTime CreateDate { get; set; }
        public virtual Address Address { get; set; }
        public int CGroupID { get; set; }
        public CGroup CGroup { get; set; }
        public virtual ICollection<Book> Books { get; set; }
    }


    public class CGroup
    {
        public int Id { get; set; }
        public string GName { get; set; }
        public ICollection<Contact> Contacts { get; set; }
    }
    public class Address
    {
        public int ID { get; set; }
        public string Contury { get; set; }
        public string City { get; set; }
        public string Street { get; set; }
        public string Code { get; set; }
        public Contact Contact { get; set; }
    }

二、新建一个EFTestContext,继承自DbContext

 public class EFTestContext : DbContext
  {
        public EFTestContext() : base("name=CommunicationContext2") { }


        public DbSet<EFModels.CGroup> CGroups { get; set; }
        public DbSet<EFModels.Address> Addresses { get; set; }
        public DbSet<EFModels.Contact> Contacts { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<EasyUIEFWebApp.DAL.EFModels.Contact>().HasOptional(c => c.Address)
                .WithOptionalDependent(add => add.Contact);
            modelBuilder.Entity<EasyUIEFWebApp.DAL.EFModels.CGroup>().HasMany(c => c.Contacts)
                .WithRequired(c => c.CGroup).WillCascadeOnDelete(false);
            //modelBuilder.Entity<EasyUIEFWebApp.DAL.EFModels.Contact>().HasOptional(c => c.CGroup)
            //    .WithMany(c => c.Contacts).WillCascadeOnDelete(true);
        }
   }

注意:base("name=CommunicationContext2") { },这句表示使用Config文件里名为CommunicationContext2的数据库连接,如果直接写base("CommunicationContext2") { }

EF会自动创建一个名为CommunicationContext2的dbf文件。数据库名也是CommunicationContext2

在WED.config里面配置链接数据库的字段,在数据库只需要建好一个库就行

<connectionStrings>
<add name="CommunicationContext2" connectionString="Data Source=.;Initial Catalog=EFText;User ID=sa;Password=qwer" providerName="System.Data.SqlClient" />
</connectionStrings>

免责声明:文章转载自《mvc+EF》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL 时间段处理(时间段筛选,时间段取交集,时间段合并,拆分)Oracle10g.CentOS6安装_遇到的问题(01)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL流行的应用程序

  SQL(Structured Query Language)不是一个应用,而是一种语言;下面是一些支持SQL语句执行的流行应用程序。   (1)Apache Open Office Base:基于Java的开源客户端数据库应用。   (2)Adobe ColdFusion:一个Web应用开发平台,基于标签的语言来创建脚本。   (3)IBM DB2:强...

使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)

前言: 一个框架中没有数据库操作是万万不能的,本框架暂时先引入gorm,后续如果gorm使用不顺手的话,就需要考虑基于Golang数据库驱动自己造轮子了 引入gorm // 在 go.mod 中加入 require github.com/jinzhu/gorm v1.9.12 在引入gorm的时候可能会遇到crypto 这个资源被墙了,拉取不到,这时...

Sql server 账号被锁住:"the account is currently locked out. The system administrator can unlock it."的解决办法(转载)

今天遇到的问题比较有意思。首先是很久没有打开测试数据库了,今天打开,使用service程序测试的时候出现下面的错误提示:Message: System.Data.SqlClient.SqlException: Login failed for user 'dcp_prod'.  Reason: The password of the account has...

impdp 时无反应

昨天,同事说他在impdp一个数据库,不大,才4G,跑了一天一夜,仍然在Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA不动了。我连进数据库检查了一下,那个impdp进程正在执行BEGIN:1 := SYS.kupc$que_int.get_status (:2, :3);END;正在waiting...

Hibernate实体对象状态和操作

一、Hibernate对象的状态 瞬态(Transient):当一个对象通过new 操作符创建,并且没有和Hibernate的session关联过,就处于瞬态。瞬态的对象在数据库里没有相应的记录和标识符,和普通Object没有区别。 持久化(Persistent):持久化的实例在数据库有对应的记录和标识符,并且在session的范围内,任何对实例的改动都...

连接MySQL报 unblock with 'mysqladmin flush-hosts' 问题解决

    工作中突然遇到有一台服务器连接不上MySQL数据库,报错如下,其他服务都正常。特此总结一下解决方法。 可以看出,产生的原因是: 同一个ip在短时间内产生太多(超过mysql数据库max_connect_errors的最大值)中断的数据库连接而导致的阻塞 max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试...