Как сделать простое копирование сущности в Linq-to-SQL? - PullRequest
1 голос
/ 02 мая 2011

Как использовать класс Linq-to-SQL, как я могу сделать простую копию сущности и сохранить ее?

У моего объекта есть идентификатор уникального идентификатора, который автоматически генерируется в SQL Server.

Мне не нужен "глубокий клон".

Я пытался использовать некоторые методы клонирования, которые существуют , но я не мог понять, как получить все сериализованное, что нужно было сериализовать (застрял на DataContext, не сериализуемом).

Могу ли я просто получить объект, отсоединить его от DataContext, обнулить уникальный идентификатор и InsertOnSubmit в новом DataContext? Если да, то как бы я это сделал?

Код VB.net предпочтителен, но не обязателен.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UPDATE:

Public Shared Function ReIssue(RequestID As Guid) As Guid

    Dim req As Request
    Dim new_req As Request

    Using dc1 As New MBDataContext()
        req = (From r In dc1.Requests Where r.ID = RequestID).Single()
    End Using

    new_req = req
    new_req.ID = Guid.Empty
    new_req.CreateDate = Nothing

    Using dc2 As New MBDataContext()
        dc2.Requests.InsertOnSubmit(new_req)
        dc2.SubmitChanges()
    End Using

End Function

Я получаю ошибку: Была предпринята попытка присоединить или добавить объект, который не является новым, возможно, был загружен из другого DataContext. Это не поддерживается.

в этой строке: dc2.Requests.InsertOnSubmit (new_req)

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Этот метод , кажется, работал отлично.

Создание окончательного кода следующим образом:

Public Shared Function ReIssue(RequestID As Guid) As Guid

    Using dc As New MBDataContext()
        Dim req As Request
        req = (From r In dc.Requests Where r.ID = RequestID).Single()

        Dim new_req As Request = DirectCast(Entity.Copy(req, New Request()), Request)

        dc.Requests.InsertOnSubmit(new_req)
        dc.SubmitChanges()

        req.ActiveRequestParentID = new_req.ID
        dc.SubmitChanges()

        Return new_req.ID
    End Using

End Function

Public NotInheritable Class Entity

    Private Sub New()
    End Sub

    Public Shared Function Copy(source As Object, destination As Object) As Object
        Dim sourceProps As System.Reflection.PropertyInfo() = source.[GetType]().GetProperties()
        Dim destinationProps As System.Reflection.PropertyInfo() = destination.[GetType]().GetProperties()
        For Each sourceProp As System.Reflection.PropertyInfo In sourceProps
            Dim column As ColumnAttribute = TryCast(Attribute.GetCustomAttribute(sourceProp, GetType(ColumnAttribute)), ColumnAttribute)
            If column IsNot Nothing AndAlso Not column.IsPrimaryKey Then
                For Each destinationProp As System.Reflection.PropertyInfo In destinationProps
                    If sourceProp.Name = destinationProp.Name AndAlso destinationProp.CanWrite Then
                        destinationProp.SetValue(destination, sourceProp.GetValue(source, Nothing), Nothing)
                        Exit For
                    End If
                Next
            End If
        Next
        Return destination
    End Function

End Class
0 голосов
/ 02 мая 2011

Обнуление уникального идентификатора и последующий вызов InsertOnSubmit - правильный путь.Некоторые вещи, которые вы должны рассмотреть, хотя:

  • Какой тип идентификатора?Это int?A Guid?Это обнуляемый?Если он допускает значение NULL, убедитесь, что он имеет значение NULL, если это int, затем 0 или Guid, а затем Guid.Empty.
  • Имеет ли тип метку временикакой-то?Если это так, то вам также нужно сбросить / установить его на ноль, в зависимости от типа.

Как только вы это сделаете, вы можете позвонить InsertOnSubmit, а затем SubmitChanges иизменение должно произойти.

Обратите внимание: если вы делаете это для большого количества записей, вам лучше написать хранимую процедуру, которая выполнит вставку в таблицу, используя выбор из другой таблицы.В таком случае это будет на намного быстрее (вы не будете загружать данные из базы данных в память, а затем выталкивать их назад, вставляя записи по одной за раз).

...