Entity Framework and WPF best practices

前端 未结 3 750
青春惊慌失措
青春惊慌失措 2020-12-28 08:54

Is it ever a good idea to work directly with the context? For example, say I have a database of customers and a user can search them by name, display a list, choose one, the

3条回答
  •  旧巷少年郎
    2020-12-28 09:27

    Microsoft Reference:

    http://msdn.microsoft.com/en-gb/library/cc853327.aspx

    They say;

    Limit the scope of the ObjectContext

    In most cases, you should create an ObjectContext instance within a using statement (Using…End Using in Visual Basic).

    This can increase performance by ensuring that the resources associated with the object context are disposed automatically when the code exits the statement block.

    However, when controls are bound to objects managed by the object context, the ObjectContext instance should be maintained as long as the binding is needed and disposed of manually.

    For more information, see Managing Resources in Object Services (Entity Framework). http://msdn.microsoft.com/en-gb/library/bb896325.aspx

    Which says;

    In a long-running object context, you must ensure that the context is disposed when it is no longer required.


    StackOverflow Reference:

    This StackOverflow question also has some useful answers...

    Entity Framework Best Practices In Business Logic?

    Where a few have suggested that you promote your context to a higher level and reference it from here, thus keeping only one single Context.


    My ten pence worth:

    Wrapping the Context in a Using Statement, allows the Garbage Collector to clean up the resources, and prevents memory leaks.

    Obviously in simple apps, this isn't much of a problem, however, if you have multiple screens, all using alot of data, you could end up in trouble, unless you are certain to Dispose your Context correctly.

    Hence I have employed a similar method to the one you have mentioned, where I've added an AddOrUpdate Method to each of my Repositories, where I pass in my New or Modified Entity, and Update or Add it depending upon whether it exists.


    Updating Entity Properties:

    Regarding updating properties however, I've used a simple function which uses reflection to copy all the properties from one Entity to Another;

    Public Shared Function CopyProperties(Of sourceType As {Class, New}, targetType As {Class, New})(ByVal source As sourceType, ByVal target As targetType) As targetType
        Dim sourceProperties() As PropertyInfo = source.GetType().GetProperties()
        Dim targetProperties() As PropertyInfo = GetType(targetType).GetProperties()
    
        For Each sourceProp As PropertyInfo In sourceProperties
            For Each targetProp As PropertyInfo In targetProperties
                If sourceProp.Name <> targetProp.Name Then Continue For
    
                ' Only try to set property when able to read the source and write the target
                '
                ' *** Note: We are checking for Entity Types by Checking for the PropertyType to Start with either a Collection or a Member of the Context Namespace!
                '
                If sourceProp.CanRead And _
                      targetProp.CanWrite Then
                    ' We want to leave System types alone
                    If sourceProp.PropertyType.FullName.StartsWith("System.Collections") Or (sourceProp.PropertyType.IsClass And _
                           sourceProp.PropertyType.FullName.StartsWith("System.Collections")) Or sourceProp.PropertyType.FullName.StartsWith("MyContextNameSpace.") Then
                        '
                        ' Do Not Store
                        '
                    Else
    
                        Try
    
                            targetProp.SetValue(target, sourceProp.GetValue(source, Nothing), Nothing)
    
                        Catch ex As Exception
    
                        End Try
    
                    End If
                End If
    
                Exit For
            Next
        Next
    
        Return target
    End Function
    

    Where I do something like;

    dbColour = Classes.clsHelpers.CopyProperties(Of Colour, Colour)(RecordToSave, dbColour)
    

    This reduces the amount of code I need to write for each Repository of course!

提交回复
热议问题