文件层次结构

时间:2015-06-13 09:29:27

标签: c# entity-framework visual-studio-2012 entity-framework-6 edmx

我是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...'.

.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; }
    }

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

  • 有人可以帮我理解这些文件的内容 .Context.tt.Context.cs.tt.cs?还有什么不同 在两个案例(EF6,EF4.1)
  • 之间的文件层次结构中
  • 我找不到OnPropertyChanging(Value) & OnPropertyChanged() EF6验证我的实体!!为什么这些方法不再存在以及如何验证我的实体 属性,如果它们不存在?

2 个答案:

答案 0 :(得分:8)

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

  • 您已获得.edmx文件,该文件是从设计人员创建的或从现有数据库生成的。但它只是一个xml文件,其中包含有关所使用的数据库结构的信息 - storage scheme,有关实体的信息 - conceptual schema以及这两者之间的映射。它不包含任何可执行代码。需要生成此代码。

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

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

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

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

enter image description here

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

这两者之间的另一个区别是1-st生成遗留ObjectContext和从EntityObect派生的实体。它们都将在.Designer.cs文件中。但不建议再这样做了(但是你仍然可以获得corresponding T4 template - 这样你就会得到OnPropertyChangedOnPropertyChanging,因为它们是{{1}的方法} class,但它们受到保护,因此您可能需要编写一些包装器)。但最好使用POCO classes and DbContext template - VS 2013在您的情况下使用的那个。然后,您将获得单独的EntityObect以生成带有.Context.tt的{​​{1}},其中.Context.cs表示表格,DbContext文件生成实体类。 DbSets.tt之间的层次结构仅显示哪个.tt由哪个.cs生成,而只有.cs将在您的应用运行时实际编译并执行

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

答案 1 :(得分:3)

*.tt个文件T4 templates用于从.EDMX file自动生成c#代码。这基本上是您的存储方案,概念方案和它们之间的映射。 .context.cs是您的DbContext(前ObjectContext),其他是实体。用于生成代码的工具是EntityModelCodeGenerator,如.edmx文件的属性所示。所以这很直接。

为了获得OnPropertyChanged课程的EntityObject,您可以按照this manual尝试自我跟踪实体。但正如您所看到的那样,现在不建议......可能只需要在您的实体中实现INotifyPropertyChanged接口(它们是partial)。代理类替换了EntityObject。 EF为每个实体生成它们(可以关闭)。并在那里包括跟踪。希望它有所帮助!

更新。因此,您可以使用它在实体本身中生成验证,但这将是一些逻辑或事件处理。通常这被放入单独的模块中,进入“释放”思想的服务。当然这取决于您的具体情况,要求。