【发布时间】:2017-11-06 10:35:30
【问题描述】:
问题: Entity对象本身就有数据库相关的属性,但是在编程领域的需求是不同的,有时候我们想多加一些:
- 属性——用于临时逻辑。
- 方法 - 用于清洁代码和编程必需品。
- 最后但重要的是 - 用于授权、显示、过滤器等的属性。
但是,显然我们不希望我们的程序在更新模型后无需重写代码即可维护。
【问题讨论】:
标签: c# asp.net-mvc entity-framework reflection attributes
问题: Entity对象本身就有数据库相关的属性,但是在编程领域的需求是不同的,有时候我们想多加一些:
但是,显然我们不希望我们的程序在更新模型后无需重写代码即可维护。
【问题讨论】:
标签: c# asp.net-mvc entity-framework reflection attributes
对于属性和方法,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 关联
【讨论】:
如您所见,数据库优先实体模型类是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
【讨论】: