2016-10-29 3 views
0

После добавления ссылки на службу к службе WCF третьей стороной (что я не могу изменить), и EF6 Модель с этим кодом:Расширение WCF объектов добавить DataAnnotations.Key

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. 

Есть куча свойств, которые нуждаются в этом, а не только один ... как я могу это решить?

+1

Почему бы не использовать Fluent API вместо аннотаций данных? –

+0

Это не очень хорошая идея с использованием модели обслуживания, так как объект может быть изменен поставщиком. Вы должны создать свою собственную модель, даже равную модели обслуживания, но вы можете реализовать все, что вам нужно для сохранения, экспорта и т. Д. Затем вы можете сопоставить модель обслуживания с вашей моделью, избегая этой проблемы. –

+0

@IvanStoev, потому что именно там EF6 отправил меня, когда он не смог определить поле первичного ключа. Оказывается, что эти поля в любом случае удалили их из сохраненных данных, поэтому я закончил делать частичные классы и добавлял новые свойства с помощью .Key и с XmlIgnore, чтобы получить результат, который я хотел. – MrGadget

ответ

0

решаемые его, создавая новые свойства, которые не будут конфликтовать с теми, в WCF, украшая их DataAnnotations.Key создавать свои собственные столбцы первичного ключа в базе данных и с XmlIgnore держать их из сериализатором:

Namespace SomeWebService 

    Partial Public Class SomeObject 
     <XmlIgnore, DataAnnotations.Key> 
     Public Property UniqueID() As Integer 
    End Class 

End Namespace 

Следует отметить, что предложение ИванаСтоева Fluent API является хорошим и может быть лучшей идеей в зависимости от того, как нужно иметь дело с данными WCF.

Смежные вопросы