1

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

4

4 回答 4

0

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

摘自我的一些代码:

[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();

因此,如果您想在更改方法中执行自定义逻辑,您可以声明一个部分类,并将您的代码如下:

public partial class Comment
{
  partial OnEmployeeCommentChanging(string value)
  {
     /* your code goes here */
  }
}
于 2012-09-07T15:13:56.120 回答
0

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

于 2012-09-07T14:57:13.570 回答
0

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

于 2012-09-07T14:38:50.847 回答
0

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

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

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

partial class Customer:EntityObject

然后您将创建一个定义为的 CustomerOverload 类库

partial class Customer

然后该类将包含您的添加等。只是不要添加方法,这些方法不会传递给客户端。

于 2012-09-07T15:12:49.693 回答