I want to embed a dataset in an application to reference at runtime, basically to act as a database specific to the machine the application is installed on, but I have a couple of questions on how to implement this.

Question 1. Dataset Properties - Build Actions
I am referencing the build actions for files article on MSDN (here), but it is not exactly obvious which build action I should specify (if any). My knee jerk reaction is to specify it as an embedded resource, but I wanted confirmation from y'all first.

Question 2. Copy to Output Directory
I am setting the copy to output directory to copy if newer. If I understand this correctly, it will not create and overwrite existing the existing DataSet file unless the schema changes, correct?

Question 3. Default Values
I want to set default values of certain columns but cannot do so in the designer. One such thing is that I have my primary key columns defined as System.Guid and I'd like new Guids. Another is that when a row is added or updated, I want to specify audit log values for the CreatedOn/By and ModifiedOn/By. To do this, I'm handling the class' RowChanging event, checking the action, and setting the value. This this correct?
Code:
Partial Public Class UserDataTable

    Private Sub UserDataTable_UserRowChanging(sender As Object, e As UserRowChangeEvent) Handles Me.UserRowChanging
        If (e.Action = DataRowAction.Add) Then
            e.Row.UserId = Guid.NewGuid()
            e.Row.CreatedOn = DateTimeOffset.UtcNow()
            e.Row.CreatedBy = If(GetCurrentUserId() IsNot Nothing, AssertCurrentUserId(), DBNull.Value)
        ElseIf (e.Action = DataRowAction.Change) Then
            e.Row.ModifiedOn = DateTimeOffset.UtcNow()
            e.Row.ModifiedBy = If(GetCurrentUserId() IsNot Nothing, AssertCurrentUserId(), DBNull.Value)
        ElseIf (e.Action = DataRowAction.Delete) Then
            e.Row.RejectChanges()
            e.Row.DeletedOn = DateTimeOffset.UtcNow()
        End If
    End Sub

End Class
Question 4. Soft Deletes
I do not want users to be able to permanently delete a record. So instead, if you reference the code above, you'll see that I check if the RowChanging action is delete, reject the changes, and set the DeletedOn value. Is this correct?

Question 5. Strongly Typed(ish) Values
I want to be able to make this easier for future developers to pick up and make changes if needed. So what I have done is created a new module named ModuleDatabase and ModuleSession that looks like this and will likely be extended:
Code:
Module ModuleDatabase

    Public Function AssertById(tableName As String, id As Guid) As DataRow
        Dim record = GetById(tableName, id)
        If (record Is Nothing) Then
            Throw New ArgumentOutOfRangeException(NameOf(id), $"{id} does not exist in {tableName}")
        End If
        Return record
    End Function

    Public Function GetById(tableName As String, id As Guid) As DataRow
        If (String.IsNullOrEmpty(tableName)) Then
            Throw New ArgumentNullException(NameOf(tableName))
        End If

        Dim database = GetCurrentDatabase()
        If (database.Tables.IndexOf(tableName) < 0) Then
            Throw New ArgumentOutOfRangeException(NameOf(tableName), $"{tableName} is not a valid table.")
        End If

        Dim table = database.Tables.Item(tableName)
        Dim primaryKeyColumn = table.PrimaryKey
        If (primaryKeyColumn Is Nothing) Then
            Throw New ArgumentException($"{tableName} does not have primary key column defined.", NameOf(tableName))
        End If

        Dim record = table.Rows.Find(id)
        Return record
    End Function

End Module

Module ModuleSession

    Private _database As DataSet

    Public Function GetCurrentDatabase() As DataSet
        If (_database Is Nothing) Then
            Throw New ArgumentNullException(NameOf(_database))
        End If
        If (_database.DataSetName <> "DataSetGraduationProjectionApplication") Then
            Throw New ArgumentException("The current DataSet is not a valid DataSetGraduationApplicataion", NameOf(_database))
        End If
        Return _database
    End Function

    Public Sub SetCurrentDatabase(database As DataSet)
        If (database Is Nothing) Then
            Throw New ArgumentNullException(NameOf(database))
        End If
        If (database.DataSetName <> "DataSetGraduationProjectionApplication") Then
            Throw New ArgumentException("The incoming DataSet is not a valid DataSetGraduationApplicataion", NameOf(database))
        End If
        _database = database
    End Sub

    Private _currentUser As DataRow

    Public Function AssertCurrentUserId() As Guid
        If (_currentUser Is Nothing) Then
            Throw New ArgumentNullException(NameOf(_currentUser), "Nobody is logged in.")
        End If
        If (_currentUser.Table.Columns.IndexOf("UserId") < 0) Then
            Throw New ArgumentOutOfRangeException("The current user is not a valid UserDataTable row.", NameOf(_currentUser))
        End If
        Return _currentUser.Field(Of Guid)("UserId")
    End Function

    Public Function GetCurrentUserId() As Guid?
        If (_currentUser Is Nothing) Then
            Return Nothing
        End If
        If (_currentUser.Table.Columns.IndexOf("User") < 0) Then
            Return Nothing
        End If
        Return _currentUser.Field(Of Guid)("UserId")
    End Function

    Public Sub SetCurrentUser(user As DataRow)
        If (user Is Nothing) Then
            Throw New ArgumentNullException(NameOf(user))
        End If
        If (user.Table.TableName <> "User") Then
            Throw New ArgumentOutOfRangeException("The incoming DataRow is not a valid UserDataTable", NameOf(user))
        End If
        _currentUser = user
    End Sub

End Module
The idea of the ModuleSession is that it will store references to values pertaining to the current instance of the application whereas the ModuleDatabase will do generic database functions. Because I am of the understanding that I do not have access to strongly typed version of my database, I am trying to make it so that when a user goes to get a record or value then they know for certain that it will return the expected thing. Is this correct or is there a better way of doing it?

Question 6. Database Data
I will admit that I am completely at a loss as to how the data is stored. Is this on an application by application basis, e.g. if a user has two instances running then will it update two separate files? Also, what will happen if I make a change to the application and provide the user with an updated install, will this blow away all of their data?