【发布时间】:2012-02-08 05:44:12
【问题描述】:
我通过将表格拖到 edml 的空设计器上来构建数据驱动模型。我知道我可以围绕我的模型建立一个数据上下文,并且我可以像访问一个类一样访问每个表,但是每个模型的代码在哪里?
我问是因为我想为类本身的每个属性的设置器添加验证。
【问题讨论】:
标签: c# sql-server linq
我通过将表格拖到 edml 的空设计器上来构建数据驱动模型。我知道我可以围绕我的模型建立一个数据上下文,并且我可以像访问一个类一样访问每个表,但是每个模型的代码在哪里?
我问是因为我想为类本身的每个属性的设置器添加验证。
【问题讨论】:
标签: c# sql-server linq
在项目的根目录中查找.dbml 文件。在该文件下,您将看到一个名为 <someDB>.designer.cs 的文件。
但是,(您也会在设计器文件的顶部看到这一点),您并不想对该文件中的类进行任何更改。
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
如果您想进行添加,您应该考虑创建 Partial 类来扩展生成的类的功能。
这是我创建的用于处理验证的示例部分类:
namespace ETL_Framework_UI
{
[MetadataType(typeof(DataObjectMD))]
public partial class DATA_OBJECT:IValidatableObject
{
public class DataObjectMD
{
[Required(ErrorMessage="The object name is required")]
[StringLength(50, ErrorMessage = "Name cannot exceed 50 characters")]
public string OBJECT_NAME { get; set; }
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
ETLDbDataContext db = new ETLDbDataContext();
var field = new[] { "OBJECT_NAME" };
var param = db.DATA_OBJECTs.SingleOrDefault(r => r.OBJECT_NAME == OBJECT_NAME && r.OBJECT_ID != OBJECT_ID);
if (param != null)
{
yield return new ValidationResult("Object name is already in use. ", field);
}
注意 您的分部类必须定义在您在designer.cs 文件顶部看到的相同命名空间中。
【讨论】:
您不想自己编辑自动生成的类,如果您需要再次生成它们,这将导致巨大的问题。您想改用带有 DataAnnotations 的部分类。这样,您的验证/额外规则将永远分开并且更易于维护。
【讨论】:
如果您要添加验证,也许 Entity Framework Code First 是一个更好的解决方案。
【讨论】: