簡體   English   中英

文件層次結構中EF6和EF4.1之間的區別

[英]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種方法:

    1. Generator內置Visual Studio - EntityModelCodeGenerator工具。 這是以前使用的遺留方法(在您的情況下在Visaul Studio 2010中)。 這將僅生成包含其中所有類的.Designer.cs文件。 但這種方法並不是最好的 - 您無法根據需要修改生成過程(例如,將DataMember屬性添加到生成的類或其他一些更改)。 這就是為什么它更好用

    2. 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模板 - 這樣你就可以得到你的OnPropertyChangedOnPropertyChanging ,因為它們是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM