EF6和EF4.1在文件层次结构中的区别
我是Entity Framework的初学者。
我注意到当我EF6 with Visual studio 2013
使用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...'.
.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 Addresses { get; set; } public virtual DbSet Customers { get; set; } }
然后.tt
文件包含.cs
文件,用于每个实体,如Customer.cs
使用这样的代码:
public partial class Customer { public Customer() { this.NameStyle = false; this.CustomerAddresses = new HashSet(); this.Orders = new HashSet(); } public int CustomerID { get; set; } }
当我EF4.1 with visual studio 2010
使用EF4.1 with visual studio 2010
时,这完全不同,模型后面的文件EF4.1 with visual studio 2010
只有一个代码!
- 有人可以帮助我理解
.tt
,.tt
,.tt
,.cs
所有这些文件是什么?两种情况(EF6,EF4.1)
之间的文件层次结构有什么不同? - 我在
OnPropertyChanging(Value) & OnPropertyChanged()
找不到OnPropertyChanging(Value) & OnPropertyChanged()
来validation我的实体!!为什么这些方法不再存在以及如果它们不存在,如何validation我的属性?
所以让我们一步一步地说清楚:
-
你有你的
.edmx
文件,它是从设计师创建的或从现有数据库生成的。 但它只是一个xml文件,其中包含有关所使用的数据库结构的信息 – 存储方案 ,有关实体的信息 – 概念架构以及这两者之间的映射。 它不包含任何可执行代码。 需要生成此代码。 -
要生成代码,将解析
.edmx
文件,并创建包含实际可执行代码的.cs
文件。 可能会使用2种方法:-
Generator内置Visual Studio – EntityModelCodeGenerator工具。 这是一种传统方法,以前使用过(在您的案例中为Visaul Studio 2010)。 这将仅生成包含其中所有类的
.Designer.cs
文件。 但是这种方法并不是最好的 – 您无法根据需要修改生成过程(例如,将DataMember
属性添加到生成的类或其他一些更改)。 这就是为什么它更好用 -
T4模板 。 这些是扩展名为
.tt
文件。 他们所做的就是在上下文菜单中选择Run custom tool
或更改.edmx
文件时执行其逻辑。 有一组可用的模板用于从.edmx
生成EF代码, 这里有一些信息。 因为这些只是常规文件,您可以根据需要修改它们(为了获得更好的编辑器体验,使用有形的T4扩展 )。 这里有关于EF中T4模板使用的一些基本信息。
-
您可以独立于Visual Studio版本在这两种方法之间进行选择 – 只需在.edmx
文件的属性中更改Code generation strategy
属性:
如果选择了Legacy ObjectContext
选项 – 您将获得单个.Designer.cs
文件的第一种方式。 如果是T4
– 那么.Designer.cs
将为空(注释表示使用了T4模板)和.tt
文件将生成使用过的代码。 因此,如果您需要与VS 2010中相同的代码 – 只需使用Legacy ObjectContext
选项。
这两者之间的另一个区别是1-st生成遗留的ObjectContext
和从EntityObect派生的实体。 它们都将在.Designer.cs
文件中。 但不建议这样做(但是你仍然可以得到相应的T4模板 – 这样你就可以得到你的OnPropertyChanged
和OnPropertyChanging
,因为它们是EntityObect
类的方法,但是它们受到保护,所以你可能需要写一些包装)。 但最好使用POCO类和DbContext模板 – VS 2013在您的情况下使用的模板 。 然后你将得到单独的.Context.tt
来生成带有派生DbContext
,其中DbSets
代表表,而.tt
文件生成实体类。 而.tt
和.cs
之间的层次结构只显示哪个.cs
是由哪个.tt
生成的,而只有.cs
将在你的应用程序运行时实际.tt
和执行。
- 现在关于
OnPropertyChanged
– 这应该只是INotifyPropertyChanged
接口的一个实现。 但是看起来您正在使用生成POCO类的模板。 这是默认和推荐的选项,但要获得INotifyPropertyChanged
的实现,您可能需要编辑模板或从Visual Studio Online库中选择另一个模板。 但是,这可能不是最好的架构解决方案,因为有时候将实体和用于UI /业务逻辑的类分开会更好。
*.tt
文件是用于从.EDMX
文件自动生成c#代码的T4模板 。 这基本上是您的存储方案,概念方案和它们之间的映射。 .context.cs
是您的DbContext
(以前的ObjectContext
),其他是实体。 用于生成代码的工具是EntityModelCodeGenerator
如.edmx
文件的属性中所示。 所以这很直截了当。
为了获得适用于EntityObject
类的OnPropertyChanged
,您可以按照本手册尝试自我跟踪实体。 但正如您所看到的那样,现在不建议……可能只需要在您的实体中实现INotifyPropertyChanged接口(它们是partial
)。 EntityObject
已被代理类取代。 EF为每个实体生成它们(可以关闭)。 并在那里包括跟踪。 希望能帮助到你!
UPDATE。 因此,您可以使用它在实体本身中生成validation,但这将是一些逻辑或事件处理。 通常这被放入单独的模块中,进入“释放”思想的服务。 当然这取决于您的具体情况,要求。