![](/img/trans.png)
[英]In EF4.1 code first, What is the difference between configuring entities using annotations, configuration files, or in the OnModelCreating?
[英]The difference between EF6 and EF4.1 in files hierarchy
我是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<Address> Addresses { get; set; }
public virtual DbSet<Customer> Customers { get; set; }
}
然后.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; }
}
這種“當我采用S完全不同EF4.1 with visual studio 2010
,有文件后面只有一個代碼.Designer.cs
的模型!
.Context.tt
, .Context.cs
, .tt
, .cs
?,什么是不同的兩種情況之間的文件層次(EF6,EF4.1)
OnPropertyChanging(Value) & OnPropertyChanged()
在EF6
來驗證我的實體!!為什么這些方法不再存在,如何在不存在,驗證我的屬性? 所以讓我們一步一步地說清楚:
你有你的.edmx
文件,它是從設計師創建的或從現有數據庫生成的。 但它只是一個xml文件,其中包含有關所使用的數據庫結構的信息 - 存儲方案 ,有關實體的信息 - 概念架構以及這兩者之間的映射。 它不包含任何可執行代碼。 需要生成此代碼。
要生成代碼,將解析.edmx
文件,並創建包含實際可執行代碼的.cs
文件。 可能會使用2種方法:
Generator內置Visual Studio - EntityModelCodeGenerator工具。 這是以前使用的遺留方法(在您的情況下在Visaul Studio 2010中)。 這將僅生成包含其中所有類的.Designer.cs
文件。 但這種方法並不是最好的 - 您無法根據需要修改生成過程(例如,將DataMember
屬性添加到生成的類或其他一些更改)。 這就是為什么它更好用
T4模板 。 這些是擴展名為.tt
文件。 他們所做的就是在上下文菜單中選擇Run custom tool
或更改.edmx
文件時執行其邏輯。 有一組可用的模板可以從.edmx
生成EF代碼, 這里有一些信息。 因為這些只是常規文件,您可以根據需要修改它們(為了獲得更好的編輯器體驗,使用有形的T4擴展 )。 關於T4模板在EF使用的一些基本信息在這里 。
您可以獨立於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
產生.Context.cs
與派生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。 因此,您可以使用它在實體本身中生成驗證,但這將是一些邏輯或事件處理。 通常這被放入單獨的模塊中,進入“釋放”思想的服務。 當然這取決於您的具體情況,要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.