我有一个从数据库创建的edmx
模型和一个metadata.cs。
在客户端中,.g.cs
包含[StringLength(X)]
个属性以及我的元数据中的属性。
我正在对平面文件导入进行一些服务器端验证,该导入与这些实体的客户端编辑分开。
我能够应用我的范围和正则表达式验证,但我无法在服务器上找到StringLength属性。有没有人知道如何做到这一点,而无需在元数据属性上手动复制StringLength属性。
修改
以下是一些代码:
服务器端文件ProductService.metadata.cs:
internal sealed class PRODUCTMetadata
{
[Required]
[RegularExpression("[A-Z]+")]
[Display(Name = "Product Code", Order = 10)]
public string Product_code { get; set; }
}
客户端Generated_Code \ NameSpace.Web.g.cs:
public sealed class PRODUCT
{
[DataMember()]
[Display(Name="Product Code", Order=10)]
[RegularExpression("[A-Z]+")]
[Required()]
[StringLength(8)] //This is what I want to know, but server side
public string Product_code
{...etc
}
}
答案 0 :(得分:2)
我对此问题进行了一些调查,但在互联网上找不到有关该主题的任何有用信息。那么'我在这里说只是假设。
如您所见,自动生成的客户端代理代码使用属性而不是服务器端代码。例如,您的实体具有来自实体模型的良好[StringLength(8)]
属性。在服务器端,自动生成的.metadata.cs
文件在实体上没有这些属性。 我认为这完全取决于代码生成模板。
我怀疑RIA Services的代码生成模板(创建.g.cs
文件)比在服务器端创建.metadata.cs
文件的模板更完整。
您的案例中缺少的属性是客户端用于UI验证的时间的95%这一事实可能解释了为什么.metadata.cs
文件的模板不会产生那些验证< / em> attributes。
我看到了2个解决问题的方法:
<强> 1。在服务器端编写自己的元数据类
一些例子:
[MetadataTypeAttribute(typeof(PRODUCT.PRODUCTMetadata))]
public partial class PRODUCT
{
internal sealed class PRODUCTMetadata
{
// Metadata classes are not meant to be instantiated.
private PRODUCTMetadata()
{
}
[StringLength(8)]
public string Product_code { get; set; }
}
}
您可以手动将任何属性添加到实体的属性中,因为实体是部分类。
不幸的是,每次修改模型时都必须维护这些元数据:如果(例如),您的数据库表列从varchar(8)
更改为varchar(10)
,您将能够从您的数据库自动更新您的EDMX模型,但您必须手动检查您的元数据是否仍然正常(在此示例中,您必须手动将[StringLength(8)]
替换为[StringLength(9)]
)。
这是关于元数据的nice link。
<强> 2。修改T4模板
第二个选项可能是最好的选项,但我没有经历过代码生成模板修改,所以我不知道可以有效地做什么。
代码生成模板称为T4模板(Text Template Transformation Toolkit)。可以修改这些模板以在代码生成过程中包含您想要的任何内容。您可以修改默认EF模板,以便像RIA Services模板一样生成缺少的属性。
这里有一些关于T4代码生成的好文章:
我写这个作为答案(它不适合作为评论),但记住它是所有假设。