文件层次结构中EF6和EF4.1之间的区别

Any*_*are 7 c# entity-framework edmx visual-studio-2012 entity-framework-6

我是Entity Framework的初学者.

我注意到当我使用时EF6 with Visual studio 2013:

我有.Designer.cs这个评论的空文件:

  // T4 code generation is enabled for model 'C:\Users\Luka\Desktop\Test\EF-db2008\AdventureWorks\AdventureWorksLib\AdventureWorksLib\AWLTModel.edmx'. 
    // To enable legacy code generation, change the value of the 'Code Generation Strategy' designer
    // property to 'Legacy ObjectContext'. This property is available in the Properties Window when the model
    // is open in the designer.

    // If no context and entity classes have been generated, it may be because you created an empty model but
    // have not yet chosen which version of Entity Framework to use. To generate a context class and entity
    // classes for your model, open the model in the designer, right-click on the designer surface, and
    // select 'Update Model from Database...', 'Generate Database from Model...', or 'Add Code Generation
    // Item...'.
Run Code Online (Sandbox Code Playgroud)

.Context.tt.Context.cs 的代码如下:

 public partial class AWLTEntities : DbContext
    {
        public AWLTEntities()
            : base("name=AWLTEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Address> Addresses { get; set; }
        public virtual DbSet<Customer> Customers { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

然后为每个实体.tt提交.cs文件,例如Customer.cs

使用这样的代码:

 public partial class Customer
    {
        public Customer()
        {
            this.NameStyle = false;
            this.CustomerAddresses = new HashSet<CustomerAddress>();
            this.Orders = new HashSet<Order>();
        }

        public int CustomerID { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

当我使用时EF4.1 with visual studio 2010,这完全不同,.Designer.cs模型背后只有一个代码!


  • 可能有人帮助我了解什么是所有这些文件 .Context.tt,.Context.cs,.tt,.cs?而在这两种情况之间的文件层次结构有什么不同(EF6,EF4.1)
  • 我无法找到OnPropertyChanging(Value) & OnPropertyChanged()EF6验证我的实体!!为什么这些方法不再存在,如何在不存在,验证我的属性?

Pav*_*l K 8

所以让我们一步一步地说清楚:

  • 你有你的.edmx文件,它是从设计师创建的或从现有数据库生成的.但它只是一个xml文件,其中包含有关所使用的数据库结构的信息- 存储方案,有关实体的信息 - 概念架构以及这两者之间的映射.它不包含任何可执行代码.需要生成此代码.

  • 要生成代码,.edmx将解析.cs文件并创建包含实际可执行代码的文件.可能会使用2种方法:

    1. Generator内置Visual Studio - EntityModelCodeGenerator工具.这是以前使用的遗留方法(在您的情况下在Visaul Studio 2010中).这将只生成.Designer.cs包含其中所有类的文件.但这种方法并不是最好的 - 您无法根据需要修改生成过程(例如,将DataMember属性添加到生成的类或其他一些更改).这就是为什么它更好用

    2. T4模板.这些是带.tt扩展名的文件.他们所做的只是Run custom tool在上下文菜单中选择时执行他们的逻辑,或者.edmx更改文件.有一组可用的模板用于生成EF代码.edmx,这里有一些信息.因为这些只是常规文件,您可以根据需要修改它们(为了获得更好的编辑器体验,使用有形的T4扩展).关于T4模板在EF使用的一些基本信息在这里.

您可以独立于Visual Studio版本在这两种方法之间进行选择 - 只需更改文件Code generation strategy属性中的属性即可.edmx:

在此输入图像描述

如果Legacy ObjectContext选择了该选项 - 您将获得单个.Designer.cs文件的第一种方式.如果T4- 那么.Designer.cs将为空(注释表示使用了T4模板),.tt文件将生成使用过的代码.因此,如果您需要与VS 2010中相同的代码 - 只需使用Legacy ObjectContext选项.

这两者之间的另一个区别是1-st生成遗留ObjectContext和从EntityObect派生的实体.他们都将在该.Designer.cs文件中.但是,不建议任何更多的(但你仍然可以得到相应的T4模板 -那样你会得到你OnPropertyChangedOnPropertyChanging回来,因为他们的方法EntityObect类,但是它们受到保护,所以你可能需要写一些包装) .但最好使用POCO类和DbContext模板 - VS 2013在您的情况下使用的模板.然后,您将分别使用表示表.Context.tt生成.Context.cs派生,并生成实体类.并且之间的层次结构和仅显示由哪个生成的层次结构,而实际上只有在您的应用程序运行时才会实际编译和执行.DbContextDbSets.tt.tt.cs.cs.tt.cs

  • 现在关于OnPropertyChanged- 这应该只是一个INotifyPropertyChanged接口的实现.但是看起来您正在使用生成POCO类的模板.这是默认和推荐的选项,但要获得实现,INotifyPropertyChanged您可能需要编辑模板或从Visual Studio Online库中选择另一个模板.但是,这可能不是最好的架构解决方案,因为有时候将实体和用于UI /业务逻辑的类分开会更好.

  • 同样值得注意的是,EDMX将在EF7中消失.因此,在EF 6之后,这些都不适用. (3认同)
  • 全部同意了.我只是开口说因为问题是询问各版本之间的edmx差异. (2认同)