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