扩展WCF对象以添加DataAnnotations.Key
本文关键字:DataAnnotations Key 添加 WCF 对象 扩展 | 更新日期: 2023-09-27 18:15:27
在向第三方WCF服务添加服务引用(我无法更改)和EF6模型后,使用以下代码:
Imports System.Data.Entity
Public Class Model1
Inherits DbContext
Public Sub New()
MyBase.New("name=Model1")
End Sub
Public Overridable Property MyActivities() As DbSet(Of SomeWebService.Activity)
End Class
…我将调用一个方法,该方法将返回一个Activity对象数组,这些对象具有自己的或通过继承的属性,以及WCF定义的其他类型的属性。我想把所有乱七八糟的东西都转储到SQL数据库中:
Dim DB As New Model1()
Dim SvcClient As SomeWebService.ServiceClient
For Each Activity As SomeWebService.Activity In SvcClient.GetObjects(foo)
DB.MyActivities.Add(Activity)
Next
With DB
.SaveChanges()
.Dispose()
End With
这是有效的,但只有在修改生成的WCF代码将DataAnnotations.Key
添加到适当的属性之后,以便EF6可以识别主键以正确创建数据库。
当服务引用更新时,所有这些更改都将丢失,因此我需要有一个具有相同名称空间和部分类以及匹配属性的单独文件来应用装饰:
Namespace SomeWebService
Partial Public Class SomeObject
<DataAnnotations.Key>
Public Property Key() As Integer
End Class
End Namespace
这会产生预期的错误:
Error BC30269 'Public Property Key As Integer' has multiple definitions with identical signatures.
有一堆属性需要这个,不只是一个…我该如何解决这个问题?
通过创建不会与WCF中的属性发生冲突的新属性来解决此问题,使用DataAnnotations.Key
装饰它们以在数据库中创建我自己的主键列,并使用XmlIgnore
使它们远离序列化器:
Namespace SomeWebService
Partial Public Class SomeObject
<XmlIgnore, DataAnnotations.Key>
Public Property UniqueID() As Integer
End Class
End Namespace
应该指出的是,@IvanStoev关于Fluent API的建议是一个很好的建议,并且可能是一个更好的主意,这取决于人们需要如何处理WCF数据。