[英]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()
我不知道其他方法。 我將創建一個空遷移,然后將以下內容添加到Up
和Down
方法中:
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.