【问题标题】:Where to put functions and validation code Entity framework在哪里放置函数和验证代码实体框架
【发布时间】:2014-01-21 06:26:03
【问题描述】:

我可以在哪里以及如何(代码示例很棒)从自动生成的类中删除业务逻辑,例如我的 Model.edmx 下的 Customer.cs

当我在设计器中编辑某些内容然后保存更改 EF 更新类时,我需要再次输入例如默认值(我知道我可以在设计器中设置它们)。

public Customer()
{
    this.Blocked = false;
    this.Code = "#00000";
    this.Contacts = new ObservableListSource<Contact>();
}

还有如何创建/在哪里放置一些基本验证(this.Code 不能为空字符串或 null)?

谢谢。

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    Entity Framework 生成的类用partial 关键字标记,您可以扩展它们添加新文件并创建部分类的其他部分。这还可以防止您在更新模型时所做的更改被覆盖。

    也许更重要的是,EF 为每个映射属性添加了一组部分方法,这允许您添加自己的验证逻辑:

    OnPropertyChanging - 包括要在更改发生之前执行的代码,例如属性验证。值参数是 属性正在更改的值。实现这个方法 在属性更改发生之前验证它。为了防止改变 从被制造出来,你必须抛出一个异常。

    OnPropertyChanged - 包含更改发生后要执行的代码,例如记录更改。

    来自How to: Execute Business Logic During Scalar Property Changes

    你的部分类应该是这样的:

    public partial class Customer()
    {
        partial void OnCodeChanging(string value) 
        {
            if(string.IsNullOrEmpty(value))
                throw new InvalidOperationException ("value cannot be null or empty");
        }
    
    }
    

    您必须确保它与其他部分存在于同一命名空间中,由 EF 创建。

    【讨论】:

    • 你能帮我通过EF6 做同样的事情吗,因为我根本找不到OnPropertyChanging
    【解决方案2】:

    看看我正在做的这个项目...https://github.com/NickStrupat/EntityFrameworkCodeFirstTriggers

    NuGet 位于... https://www.nuget.org/packages/EntityFrameworkCodeFirstTriggers/

    您可以放入实体持久化时执行的逻辑(SaveChanges())。

    customer.Inserting += (sender, args) => ((Customer)customer).Code = "Some default";
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多