После добавления ссылки на службу к службе 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.
Есть куча свойств, которые нуждаются в этом, а не только один ... как я могу это решить?
Почему бы не использовать Fluent API вместо аннотаций данных? –
Это не очень хорошая идея с использованием модели обслуживания, так как объект может быть изменен поставщиком. Вы должны создать свою собственную модель, даже равную модели обслуживания, но вы можете реализовать все, что вам нужно для сохранения, экспорта и т. Д. Затем вы можете сопоставить модель обслуживания с вашей моделью, избегая этой проблемы. –
@IvanStoev, потому что именно там EF6 отправил меня, когда он не смог определить поле первичного ключа. Оказывается, что эти поля в любом случае удалили их из сохраненных данных, поэтому я закончил делать частичные классы и добавлял новые свойства с помощью .Key и с XmlIgnore, чтобы получить результат, который я хотел. – MrGadget