【问题标题】:Extending WCF Objects to add DataAnnotations.Key扩展 WCF 对象以添加 DataAnnotations.Key
【发布时间】:2016-10-29 14:56:26
【问题描述】:

在将服务引用添加到第 3 方 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.

有很多属性需要这个,而不仅仅是一个......我该如何解决这个问题?

【问题讨论】:

  • 为什么不使用 Fluent API 而不是 Data Annotations?
  • 以这种方式使用服务模型不是一个好主意,因为提供者可以修改对象。你应该创建自己的模型,甚至等同于服务模型,但是你可以实现所有你需要的持久化、导出等。然后你可以将服务模型映射到你的模型,避免这种问题。
  • @IvanStoev 因为这是 EF6 在无法确定主键字段时发送给我的地方。事实证明,标记这些字段无论如何都会从存储的数据中消除它们,所以我最终做了部分类并使用 .Key 和 XmlIgnore 添加新属性以获得我想要的结果。

标签: c# vb.net wcf entity-framework-6


【解决方案1】:

通过创建不会与 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 数据可能是一个更好的主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多