对生成的Linq实体类进行更多验证

时间:2009-08-14 19:22:06

标签: c# linq-to-sql partial-classes

我们使用sqlmetal生成我们的DBML,通过转换运行它,然后使用sql metal生成DataContext类 - 另外,我想根据我们存储的一些元数据自动为实体生成一些验证关于每个实体及其属性的数据库。例如,如果一个实体拥有我所知道的元类型“Email”的“EmailAddress”字段,我想为Email实体创建OnValidate方法,以检查它是否符合我的正则表达式。这一切都很好,花花公子,我可以在另一个文件中这样做:

public partial class MYENTITY
{
    partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        if(action != System.Data.Linq.ChangeAction.Delete)
        {
            //check the validity of my email field or anything else
        }
    }
}

如何在允许希望使用此DataContext的开发人员将自己的逻辑挂钩到此实体的OnValidate方法的同时,如何执行此操作?在我们的情况下,这将是特定于正在开发的应用程序的业务逻辑。我上面描述的新增内容只是确保进入数据库的数据符合我预期的安全措施。

感谢您的帮助。新来的,如果我做错了,请道歉。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望能够使用metada在特定文件中动态生成OnValidate方法,但仍允许开发人员向OnValidate方法添加自定义项?一种方法是使用此模板生成代码:

public partial class MYENTITY
{
    partial void OnValidateCustomization();

    public void OnValidate(System.Data.Linq.ChangeAction action)    
    {        
        if(action != System.Data.Linq.ChangeAction.Delete)        
        {            
            //hook for code generator
        }   
        OnValidateCustomization();
    }
}

让您的开发人员,在另一个文件或同一个文件中,取决于您在运行动态代码文件生成时如何处理现有文件,实现OnValdateCustomization()方法:

public partial class MYENTITY
{
    partial void OnValidateCustomization()
    {
         Console.WriteLine("I Worked.");
    }
}

但是,我假设你是如何动态生成代码的。您是否还可以在生成的文件中添加令牌并允许修改文件,而不是仅在再次运行动态代码生成器时复制它们?所以你只是注入那些令牌而不是替换整个文件?唉,这是缺少的细节......