• Entity Framework优缺点及使用方法总结


    Entity Framework是M$提供的一个ORM框架,它旨在为小型应用程序中数据层的快速开发提供便利。

    nuget上185W多的下载量,说明.Net开发人员还是比较喜欢用EF的。但是EF在提供了便利性的同时也有许多缺点,以下就是我认为不应该应用EF的场景:

    • 非SQL Server数据库且无该数据库的DataProvider
    • 高性能要求。在进行一些复杂查询的情况下,EF的性能表现不太好,而开发人员又无法控制SQL语句的生成
    • 高安全性要求。有时候DB用户仅仅具有EXEC的权限,而EF自动生成的类又不好用,还是需要自己来写。

    一些大中型企业应用往往具有以上几种情况,此时就不适合使用EF了。

    至于使用什么ORM,我个人认为NHibernate配置起来太麻烦,如果没什么太特殊的要求,可以试一下ServiceStack.OrmLite能不能满足需求。或者直接上ADO.Net

    如果非要使用EF,建议使用EF最新的稳定发布版本(支持DbContext+Code first方式开发)。然后读一下《Programming Entity Framework Code First》和《Programming Entity Framework DbContext》这两本书(目前无中文版)。使用DbContext+Code first POCO+Repository模式,这样既可以保证EF被Repository隔离,又可以保证可测试性,还能在需要更换ORM框架甚至是换成ADO.Net时少改一点代码。

    提供示例代码下载(.Net 4+EF5)

    示例代码中有POCO和EF的Configurations,把EF相关的Configurations单独拿出来保证了DB Model的纯洁性。在这里大体摘一点东西给大家看看

    首先是数据库结构,我使用的是Code first,在第一次有实际的数据库操作的时候会自动生成数据库,生成后的数据库结构如下图:

    clip_image002

    数据库的生成策略在EFContext类的静态构造里面:

    static EFContext()
    {
       // 指定数据库生成策略为不存在时生成
        // 还可以指定为:
        // DropCreateDatabaseAlways(总是删除原有数据库重建)
        // DropCreateDatabaseIfModelChanges(数据库模型改变后删除原有数据库重建)
        Database.SetInitializer<EFContext>(new CreateDatabaseIfNotExists<EFContext>());
    }

    Album表的Configuration设置:

    public class AlbumConfiguration : EntityTypeConfiguration<Album>
    {
        public AlbumConfiguration()
        {
            // 指定数据表名
            ToTable("dbo.Album");
    
            // 设定主键
            HasKey(x => x.Id);
    
            // 设定数据列名及其它属性
            Property(x => x.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
            Property(x => x.AlbumName).HasColumnName("AlbumName").IsRequired().HasMaxLength(50);
            Property(x => x.ArtistId).HasColumnName("ArtistId").IsRequired();
    
            // 设置外键约束
            HasRequired(foreignKeyTable => foreignKeyTable.Artist)
                .WithMany(primaryKeyTable => primaryKeyTable.Albums)
                .HasForeignKey(foreignKeyTable => foreignKeyTable.ArtistId);
    
            // 设置多对多关联
            HasMany(thisTable => thisTable.Tags)
                .WithMany(anotherForeignKeyTable => anotherForeignKeyTable.Albums)
                .Map(relationTable => relationTable
                    .MapLeftKey("TagId")
                    .MapRightKey("AlbumId")
                    .ToTable("AlbumTags")
                );
        }
    }

    重写EFContext类中的OnModelCreating函数,使用我们自定义的Configurations:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        // 设定数据库生成配置
        modelBuilder.Configurations.Add(new ArtistConfiguration());
        modelBuilder.Configurations.Add(new AlbumConfiguration());
        modelBuilder.Configurations.Add(new TagConfiguration());
    }

    Repository模式这里我就不多说了,具体看AbstractDbAccessor项目中的内容,EF的Repository实现在ConcreteDbAccessor项目EntityFramework目录下的EFDbAccessor和Repository目录

  • 相关阅读:
    【LCT维护基环内向树森林】BZOJ4764 弹飞大爷
    【LCT】BZOJ3091 城市旅行
    【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
    【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
    【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测
    【有上下界的网络流】ZOJ2341 Reactor Cooling(有上下界可行流)
    【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)
    从输入url到页面加载的过程
    forEach和map的区别
    理解 JavaScript 对象原型、原型链如何工作、如何向 prototype 属性添加新的方法。
  • 原文地址:https://www.cnblogs.com/badly1984/p/3203565.html
Copyright © 2020-2023  润新知