Как создать общий репозиторий с Entity Framework 4.0, где у меня есть функции импорта? - PullRequest
0 голосов
/ 23 февраля 2010

У меня есть общий репозиторий, с которым я общаюсь с моим контекстом объекта. В моем объектном контексте есть функции импорта, которые я хочу вызывать через мой общий репозиторий. В настоящее время я вызываю их через функцию Execute, но это не идеально, потому что мне приходится передавать имя и параметры моей функции в виде строк, которые могут вызвать исключения во время выполнения. Моя функция импортирует карту в сложные типы.

Есть ли способ сделать что-то похожее на:

Dim rep As IRepository(Of ComplexType)

Dim type As ComplexType = rep.Find(where:=Function(t) t.FunctionImport(parm, parm)).First()

Вот мой общий репозиторий:

Public Class EFRepository(Of T As Class)
Implements IRepository(Of T)

Private _context As ObjectContext
Private _objectSet As IObjectSet(Of T)
Private _objectResult As ObjectResult(Of T)

Private ReadOnly Property Context() As ObjectContext
    Get
        If _context Is Nothing Then
            _context = New SupportSiteContainer()
        End If

        Return _context
    End Get
End Property

Private ReadOnly Property ObjectSet() As IObjectSet(Of T)
    Get
        If _objectSet Is Nothing Then
            _objectSet = Me.Context.CreateObjectSet(Of T)()
        End If

        Return _objectSet
    End Get
End Property

Public Function GetQuery() As IQueryable(Of T) Implements IRepository(Of T).GetQuery
    Return ObjectSet
End Function

Public Function GetAll() As IEnumerable(Of T) Implements IRepository(Of T).GetAll
    Return GetQuery().ToList()
End Function

Public Function Find(ByVal where As Func(Of T, Boolean)) As IEnumerable(Of T) Implements IRepository(Of T).Find

    Return Me.ObjectSet.Where(where)
End Function

Public Function [Single](ByVal where As Func(Of T, Boolean)) As T Implements IRepository(Of T).[Single]
    Return Me.ObjectSet.[Single](where)
End Function

Public Function First(ByVal where As Func(Of T, Boolean)) As T Implements IRepository(Of T).First
    Return Me.ObjectSet.First(where)
End Function

Public Sub Delete(ByVal entity As T) Implements IRepository(Of T).Delete
    Me.ObjectSet.DeleteObject(entity)
End Sub

Public Sub Add(ByVal entity As T) Implements IRepository(Of T).Add
    Me.ObjectSet.AddObject(entity)
End Sub

Public Sub Attach(ByVal entity As T) Implements IRepository(Of T).Attach
    Me.ObjectSet.Attach(entity)
End Sub

Public Sub SaveChanges() Implements IRepository(Of T).SaveChanges
    Me.Context.SaveChanges()
End Sub

Public Function Execute(ByVal functionName As String, ByVal ParamArray parameters() As System.Data.Objects.ObjectParameter) As ObjectResult(Of T) Implements IRepository(Of T).Execute

    Return Me.Context.ExecuteFunction(Of T)(functionName, parameters)
End Function
End Class

1 Ответ

2 голосов
/ 23 февраля 2010

Можно использовать универсальный репозиторий, но не использовать их не более . Если у вас есть функциональность, специфичная для сущности, вы можете подтипить свой общий интерфейс и расширить его с помощью нужных вам функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...