手动采用Db First模型

时间:2012-09-07 14:36:18

标签: c# entity-framework

我有一个使用EF和DbFirst模型的项目。 需要调整实体的某些属性以满足项目的需要。我是通过手动编辑.edmx Designer文件来完成的。这些调整是次要的字符串操作。 问题是:每次从数据库更新模型时,都会覆盖这些更改。还有另一种方法吗?

4 个答案:

答案 0 :(得分:0)

不是真的,除了从数据库进行修改,因此这些更改将保持停滞,否则会在模型更新时创建一个事件,因此每次更新模型时,您的设置都会得到加强。

答案 1 :(得分:0)

当您从数据库更新模型时,它会被刷新。您需要创建一个单独的类,您可以在其中定义实体,并可以自定义它。

答案 2 :(得分:0)

其他两个答案涵盖了你需要的大部分内容。

您的实体模型都构建为部分类。每次对数据库执行任何操作时,都会更改类定义。这就是为什么他们都有标题说不要改变这个代码!

假设您有一个数据所在的数据项目,我在同一个项目中创建新类。所以如果你的模型是

partial class Customer:EntityObject

然后,您将创建一个定义为

的CustomerOverload类库
partial class Customer

然后该类将包含您的添加内容等。只是不添加方法,这些方法不会转移到客户端。

答案 3 :(得分:0)

根据您想要做的事情,EF有很多“钩子”可供您使用,因此您可以添加自定义代码,而不是在设计器中。所有类都是部分类,因此您可以创建一个分部类,然后挂钩到OnYourPropertyNameChanging,如果想要更改setter。

摘自我的一些代码:

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public global::System.String EmployeeComment
{
    get
    {
        return _EmployeeComment;
    }
    set
    {
        OnEmployeeCommentChanging(value);
        ReportPropertyChanging("EmployeeComment");
        _EmployeeComment = StructuralObject.SetValidValue(value, true);
        ReportPropertyChanged("EmployeeComment");
        OnEmployeeCommentChanged();
    }
}
private global::System.String _EmployeeComment;
partial void OnEmployeeCommentChanging(global::System.String value);
partial void OnEmployeeCommentChanged();

所以,如果你想在Changing方法中做自定义逻辑,你可以声明一个部分类,并按如下方式放置你的代码:

public partial class Comment
{
  partial OnEmployeeCommentChanging(string value)
  {
     /* your code goes here */
  }
}