【问题标题】:How to keep properties attributes inserted into auto-generated files in ASP.NET MVC如何将属性属性插入到 ASP.NET MVC 中的自动生成的文件中
【发布时间】:2017-01-22 11:50:43
【问题描述】:

我使用 ASP.NET MVC 5 和 Entity Framework 6。所以我在 *.tt 下生成了一些文件

我想保留我插入到这些文件中的属性,因为我已经基于实体框架类自动创建了许多页面。

但是当我从数据库更新实体框架模型时,我丢失了我插入的所有内容。

所以我的问题是如何防止它被删除?

//--------------------------------------------- --------------------------------- // // 此代码是从模板生成的。 // // 手动更改此文件可能会导致意外行为 你的申请。 // 手动更改此文件将是 如果重新生成代码,则覆盖。 // //------------------------------------------------ ------------------------------

namespace MyWebSIte.DataModel
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class ItemMovement
    {
        public System.Guid ID { get; set; }

        [DataType(DataType.DateTime)]  <---- I would like to keep it.
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        [Display(Name = "Fecha")]
        public System.DateTime? Changed { get; set; }

【问题讨论】:

    标签: c# .net entity-framework asp.net-mvc-5


    【解决方案1】:

    生成的类 ItemMovement 是一个分部类。
    这允许您编写第二个分部类,该类标有必要的数据注释。
    在您的情况下,部分类 ItemMovement 看起来像这样:

       namespace MyWebSIte.DataModel
        {
            using System;
            using System.Collections.Generic;
            using System.ComponentModel;
            using System.ComponentModel.DataAnnotations;
    
            [MetadataType(typeof(ItemMovementMetaData))]
            public partial class ItemMovement
            {
                public System.Guid ID { get; set; }        
                public System.DateTime? Changed { get; set; }
            }
    
            public partial class ItemMovementMetaData {
    
                [DataType(DataType.DateTime)]
                [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
                [Display(Name = "Fecha")]
                public System.DateTime? Changed { get; set; }   
    
                //....................
            }
        }
    

    【讨论】:

    • 我们可以在 ASP.NET MVC 中自动生成它吗?
    • 如果您必须手动提供注释,您将如何自动生成它们?
    • 你不能动态生成它们,你必须手动编写它们
    • 我的意思是由实体框架生成的 *.tt 下的所有实体类,但我想问是否可以像我们在 RIA 服务中那样生成 MetadataCalsses。
    • 你的答案是正确的,但我找到了一个类似的stackoverflow.com/questions/2229716/…,在那里我还发现了这个应用程序pfsolutions-mi.com/Product/MetaDataClassGenerator,它可以完成我需要手动完成的所有工作。
    【解决方案2】:

    这些文件不能手动编辑。您应该利用这些类是partial 并且可以“扩展”的事实。看看Metadata classes,它们将允许您对属性进行注释。

    【讨论】:

    • 它用于 RIA 服务。我不使用它。你确定我们可以将它用于 ASP.NET MVC?
    • 坦率地说,我只关注展示如何使用元数据类的部分。主体是相同的 - 您创建一个元数据类,您为实体类型创建一个部分类并用属性标记它。看这里:stackoverflow.com/a/4916085/6804888
    • 当然还有第二个选项,它涉及为实体创建interface 并用注释标记其中的属性,但它也在我提供的 SO 链接中进行了描述。
    【解决方案3】:

    您可以使用 codefirst,它可以让您最大程度地控制您的模型和 dbcontext。

    步骤 1:使用现有数据库创建 codefirst 模型。 codefirst model using the existing database

    第 2 步:现在在包管理器控制台中输入 enable-migrations

    第 3 步:使用 (db) 上下文和从数据库表生成的模型。 更改您的模型

    第 4 步:在包管理器控制台中键入 add-migration [用于标识迁移的名称]

    第五步:检查生成的迁移文件。

    第 6 步:在包管理器控制台中输入 update-database

    现在您的更改已更新到数据库。从现在开始,您可以使用 codefirst 方法来处理对数据库的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2015-11-03
      相关资源
      最近更新 更多