【问题标题】:Entity Framework on ASP .NET MVC – Extend Entity for Attributes, Methods and PropertiesASP .NET MVC 上的实体框架 – 为属性、方法和属性扩展实体
【发布时间】:2017-11-06 10:35:30
【问题描述】:

问题: Entity对象本身就有数据库相关的属性,但是在编程领域的需求是不同的,有时候我们想多加一些:

  1. 属性——用于临时逻辑。
  2. 方法 - 用于清洁代码和编程必需品。
  3. 最后但重要的是 - 用于授权、显示、过滤器等的属性。

但是,显然我们不希望我们的程序在更新模型后无需重写代码即可维护。

【问题讨论】:

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


    【解决方案1】:

    对于属性和方法,Entity Framework 平台将模型中的所有对象作为部分类生成,.NET 环境允许我们根据需要扩展它们:

    记得检查我们的部分是否位于相同的命名空间中(请注意,当我们在模型目录或它们自己的目录中创建它们时,Visual Studio 会创建附加命名空间。

    public partial class ErrorLog
    {
        public long pk { get; set; }
        public int lineNumber { get; set; }
        public Nullable<int> error { get; set; }
    }
    

    我们的部分:

    public partial class ErrorLog
    {
        public  string getErrorDescription()
        {
            return d[(int)error];
        }
    
        private static Dictionary<int, string> d = new Dictionary<int, string>()
        {
            {1,"desc1" },
            {2,"desc2" },
            {3,"desc3" },
            {4,"desc4" }
        };
    
    }
    

    对于属性:

    我们可以添加新界面

    public interface IErrorLogsMetaData
    {
    
        [Display(Name = "Id")]
        long pk { get; set; }
    
        [Display(Name = "The line Number")]
        int lineNumber { get; set; }
    
        [Display(Name = "The Error")]
        Nullable<int> error { get; set; }
    
    
    }
    

    在我们的实体(甚至扩展)对象上实现它们。 为此,我们需要通过以下方式在 global.asax 中反映和预订:

    TypeDescriptor.AddProviderTransparent(
    new AssociatedMetadataTypeTypeDescriptionProvider(typeof(ErrorLog), typeof(IErrorLogsMetaData)), typeof(ErrorLog));
    

    TypeDescriptor——我们熟悉的反射,它获取关于类型的信息。 AddProviderTransparent – 是从我的部分受信任的代码中调用的方法,并从关联的类中获取元数据。

    第一个参数是provider,它是我们要装饰的类型和属性接口的TypeDescriptionProvider,第二个参数是description的目标类型。

    另一种选择 让你的局部视图实现 IErrorLogsMetaData 然后你就不需要在 Global.asax 关联

    【讨论】:

    • 虽然该主题已经存在,但对此进行了很好的解释 +1。请注意,这不是唯一的方法
    【解决方案2】:

    如您所见,数据库优先实体模型类是partial,因此您可以创建自己的部分类,例如,如果您有:

    public partial class SomeClass
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
    

    你可以这样做:

    为您的项目添加一些类,将其命名为SomeClassPartial

    //SomeClassPartial.cs
    namespace YourNamespace
    {
        [MetadataType(typeof(SomeClassMetadata))]
        public partial class SomeClass
        {
            //add your new properties/some_logic here
    
            public string NewPropX { get; set; }
            public string NewPropY { get; set; }
        }
    
        public partial class SomeClassMetadata
        {
            //metadata for your existing model properties
    
            [Display(Name = "Property 1")]
            public string Prop1 { get; set; }
    
            [Display(Name = "Property 2")]
            public string Prop2 { get; set; }
        }
    }
    

    在您的SomeClassMetadata 类中,您可以使用MetadataType 属性将数据注释属性添加到现有属性,该属性将指定要与数据模型类关联的元数据类,并且您可以告诉您部分SomeClass类从SomeClassMetadata 类中获取该属性。要添加新的自定义属性,您可以使用SomeClass 部分类。

    MSDN 链接:MetadataTypeAttribute Class

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多