在我的 EF4 EntityModel 中,我有一个名为 USERS 的实体。 USERS 具有通用的 UserName 和 Password 字符串字段。如果我这样做:
Dim u as new USERS
U.UserName = String.Empty
那么 U.UserName 还是什么都没有。但是如果我这样做:
Dim u as new USERS
u.UserName = “A”
u.UserName = String.Empty
然后 U.UserName 毫无问题地将 String.Empty 作为值。
原因是 EF4 生成 UserName 属性的方式
Public Property UserName() As Global.System.String
Get
Return _UserName
End Get
Set
If (_UserName <> Value) Then ‘Here is the key
OnUserNameChanging(value)
ReportPropertyChanging("UserName")
_UserName = StructuralObject.SetValidValue(value, false)
ReportPropertyChanged("UserName")
OnUserNameChanged()
End If
End Set
End Property
我的问题是:
我该如何处理?
我可以做些什么来避免这种行为?我不想每次想将 string.empty 设置为没有任何值的属性时都进行两次赋值,而且我不想记住我每次都必须这样做,因为我很确定我会忘记它,然后我会在代码中引入错误。我只想将 empty.string 值分配给一个属性,该属性将“”作为值。
因为我来自 C# 并且我是 vb.net 的新手,我真的希望我错过了一些东西。
最佳答案
您确定要分配空字符串而不是空值吗?如果不是,您可以将属性设置为可为空吗?
无论哪种方式,您都可以使用 T4 模板(VS 称它们为代码生成器)来操作 EF 生成的代码,因此您可以通过这样做将属性 setter 实现更改为您想要的任何内容。
编辑 - 添加更多细节
如果您使用 POCO 生成器,您将获得普通属性,即没有属性更改等
如果您使用 EntityObject 生成器,它基本上可以让您编辑当前拥有的生成。如果您使用适用于 Visual Studio 的 T4 插件,您会在 T4 上获得语法高亮显示,VS2010 插件中有一些免费的非常好。您基本上拥有可以在那里生成代码的代码,您可以对其进行调整。您标记的行在第 523 行:
If (<#=code.FieldName(primitiveProperty)#> <> Value) Then
您可以尝试根据类型做一些时髦的事情,或者您可以恢复使用 Object.Equals() 或您想要的任何其他东西,而不是这一行。或者您可以完全删除 If 部分,但这可能会产生其他后果。当您保存 T4 模板时,它会为您更新所有生成的代码。
根据您的实际操作,POCO 模板可能会解决您的问题。
顺便说一句,如果您想了解更多关于 T4 的信息,请访问 Oleg Sych 的博客,http://www.olegsych.com/tag/t4/ .
关于.net - 将空字符串分配给当前值为空的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605014/