簡體   English   中英

實體框架6代碼優先UDT

[英]Entity Framework 6 Code First UDT

我正在努力確定如何使用EF6定義用戶定義類型。 我知道可以使用復雜類型,但是關於如何執行此操作的其他信息很少。

假設在這個示例中,我們要在User表中插入多行,而在team表中插入一行。 UDT的模式反映了將其插入到的表。

const string insertQuery = @"
BEGIN TRY
    SET XACT_ABORT ON
    BEGIN TRANSACTION
        INSERT INTO [dbo].[Team] (Id, TeamName) 
        VALUES (, );

        INSERT INTO [dbo].[User] (Id, Name)
        SELECT * FROM 
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH";

DataTable userTable = new DataTable();
userTableType.Columns.Add("Id", typeof(long));
userTableType.Columns.Add("Name", typeof(string));
userTableType.Rows.Add(1, "Mike");
userTableType.Rows.Add(2, "Sam");

object values = new {
    TeamId = 10,
    TeamName = "something",
    // dapper extension method
    Users = userTable.AsTableValuedParameter("[dbo].[UserTableType]");
};

// wrapper around dapper. not important.
await this.sqlAccess.ExecuteAsync(InsertQuery, values);

如果我以前曾在SSMS中運行過,則此查詢將按預期運行(或者我假設任何不引用創建的類型的查詢)

IF NOT EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'UsersTableType')
    CREATE TYPE [dbo].[UserTableType] AS TABLE (Id bigint, Name nvarchar(max));

我需要確保在創建數據庫時此類型可用,希望使用代碼優先遷移或什至是在遷移中手動編寫的代碼來實現。

除了使用MigrationBuilder.Sql()我不知道其他方法。 我將創建一個空遷移,然后將以下內容添加到UpDown方法中:

protected override void Up(MigrationBuilder migrationBuilder)
{
    const String sql = "CREATE TYPE [dbo].[UserTableType] AS TABLE (Id bigint, Name nvarchar(max))";
    migrationBuilder.Sql(sql);
}

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.Sql(@"DROP TYPE IF EXISTS [UserTableType]");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM