扩展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

通过创建不会与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数据。