P.B*_*key 92 c# entity-framework asp.net-mvc-4
我有实体框架生成的以下类:
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个必填字段
[Required]
public int RequestId { get;set; }
Run Code Online (Sandbox Code Playgroud)
但是,因为这是生成的代码,这将被消灭.我无法想象一种创建分部类的方法,因为属性是由生成的分部类定义的.如何以安全的方式定义约束?
MUG*_*G4N 139
生成的类ItemRequest将始终是一个partial类.这允许您编写第二个部分类,该部分类标有必要的数据注释.在您的情况下,部分类ItemRequest看起来像这样:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
//make sure the namespace is equal to the other partial class ItemRequest
namespace MvcApplication1.Models
{
[MetadataType(typeof(ItemRequestMetaData))]
public partial class ItemRequest
{
}
public class ItemRequestMetaData
{
[Required]
public int RequestId {get;set;}
//...
}
}
Run Code Online (Sandbox Code Playgroud)
小智 39
正如MUG4N所回答的,你可以使用部分类,但更好地使用接口.在这种情况下,如果EF模型与验证模型不对应,则会出现编译错误.因此,您可以修改EF模型,而无需担心验证规则已过时.
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace YourApplication.Models
{
public interface IEntityMetadata
{
[Required]
Int32 Id { get; set; }
}
[MetadataType(typeof(IEntityMetadata))]
public partial class Entity : IEntityMetadata
{
/* Id property has already existed in the mapped class */
}
}
Run Code Online (Sandbox Code Playgroud)
PS如果您使用的项目类型与ASP.NET MVC不同(当您执行手动数据验证时),请不要忘记注册您的验证器
/* Global.asax or similar */
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Entity), typeof(IEntityMetadata)), typeof(Entity));
Run Code Online (Sandbox Code Playgroud)
Car*_*lin 14
我找到了像MUG4N这样的解决方案,但是将MetaData类嵌套在实体类中,从而减少了公共命名空间列表中的类数,并且无需为每个元数据类创建唯一的名称.
using System.ComponentModel.DataAnnotations;
namespace MvcApplication1.Models
{
[MetadataType(typeof(MetaData))]
public partial class ItemRequest
{
public class MetaData
{
[Required]
public int RequestId;
//...
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是@dimonser答案的一种扩展,如果重新生成数据库模型,则必须手动重新添加这些类的接口.
如果你有胃,你也可以修改你的.tt模板:
以下是在某些类上自动生成接口的示例,这是来自您的以下.tt替换EntityClassOpening方法的片段(显然var stringsToMatch是您的实体名称和接口).
public string EntityClassOpening(EntityType entity)
{
var stringsToMatch = new Dictionary<string,string> { { "Answer", "IJourneyAnswer" }, { "Fee", "ILegalFee" } };
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}{4}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)),
stringsToMatch.Any(o => _code.Escape(entity).Contains(o.Key)) ? " : " + stringsToMatch.Single(o => _code.Escape(entity).Contains(o.Key)).Value : string.Empty);
}
Run Code Online (Sandbox Code Playgroud)
不过,正常人不应该对自己这样做,已经在圣经中证明了一个人为此而去地狱.
| 归档时间: |
|
| 查看次数: |
59116 次 |
| 最近记录: |