Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để sử dụng chú thích cấu trúc để đặt kiểu SQL thành Ngày trong cách tiếp cận đầu tiên của mô hình

Chú thích cấu trúc - hay. Đây là lần đầu tiên tôi nghe nói về tính năng này nhưng nó hoạt động. Tôi chỉ thử nó. Tôi sẽ cố gắng giải thích nó một chút.

Chú thích cấu trúc chỉ là xml ngẫu nhiên được thêm vào tệp EDMX. Trên thực tế, tệp EDMX chỉ là XML có 4 phần - CSDL, MSL, SSDL và một phần liên quan đến các phần tử định vị trong trình thiết kế.

  • CSDL mô tả các thực thể và liên kết giữa các thực thể (được định nghĩa trong trình thiết kế)
  • SSDL mô tả các bảng và quan hệ
  • MSL mô tả ánh xạ giữa CSDL và SSDL

Nếu bạn bắt đầu với mô hình trước (bạn muốn tạo cơ sở dữ liệu từ mô hình của mình), bạn chỉ có phần CSDL và cả SSDL và MSL sẽ được tạo bởi một số quy trình tự động (các mẫu T4 được thực thi trong quy trình làm việc) sau khi SSDL được tạo, một mẫu T4 khác sẽ tạo Tập lệnh SQL để tạo cơ sở dữ liệu.

Chú thích cấu trúc được mô tả trong chủ đề của diễn đàn MSDN được liên kết là một gợi ý. Bạn sẽ đặt chú thích cấu trúc vào phần CSDL của EDMX (bạn phải mở EDMX dưới dạng XML - nhấp vào tệp trong trình khám phá giải pháp và chọn Mở bằng). CSDL thử nghiệm của tôi mô tả thực thể Người dùng duy nhất có ba thuộc tính (thực thể hiển thị trên ảnh chụp màn hình sau trong câu trả lời):

<!-- CSDL content -->
<edmx:ConceptualModels>
  <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" 
          xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" 
          xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
          xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"
          xmlns:custom="http://tempuri.org/custom"
          Namespace="Model" Alias="Self" >
    <EntityContainer Name="ModelContainer" annotation:LazyLoadingEnabled="true">
      <EntitySet Name="UsersSet" EntityType="Model.User" />
    </EntityContainer>
    <EntityType Name="User">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
      <Property Type="String" Name="Login" Nullable="false" />
      <Property Type="DateTime" Name="CreatedAt" Nullable="false">
        <custom:SqlType edmx:CopyToSSDL="true">Date</custom:SqlType>
      </Property>
    </EntityType>
  </Schema>
</edmx:ConceptualModels>

Tôi đã thêm định nghĩa không gian tên tùy chỉnh trong Schema phần tử:xmlns:custom="http://tempuri.org/custom" và chú thích cấu trúc tùy chỉnh được xác định cho CreatedAt tài sản:

<Property Type="DateTime" Name="CreatedAt" Nullable="false">
   <custom:SqlType edmx:CopyToSSDL="true">Date</custom:SqlType>
</Property>

Tên của không gian tên hoặc phần tử được sử dụng cho chú thích cấu trúc không quan trọng - bạn sử dụng tên nào hoàn toàn tùy thuộc vào bạn. Điều quan trọng duy nhất là edmx:CopyToSSDL="true" thuộc tính. Thuộc tính này được nhận dạng bởi mẫu T4 được sử dụng để tạo SSDL và nó chỉ lấy phần tử này và đặt nó vào SSDL. SSDL đã tạo trông giống như sau:

<Schema Namespace="Model.Store" Alias="Self" 
        Provider="System.Data.SqlClient" ProviderManifestToken="2008" 
        xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" 
        xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
  <EntityContainer Name="ModelStoreContainer">
    <EntitySet Name="UsersSet" EntityType="Model.Store.UsersSet" store:Type="Tables" Schema="dbo" />
  </EntityContainer>
  <EntityType Name="UsersSet">
    <Key>
      <PropertyRef Name="Id" />
    </Key>
    <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
    <Property Name="Login" Type="nvarchar(max)" Nullable="false" />
    <Property Name="CreatedAt" Type="datetime" Nullable="false">
      <custom:SqlType xmlns:custom="http://tempuri.org/custom">Date</custom:SqlType>
    </Property>
  </EntityType>
</Schema>

Điểm duy nhất là chuyển chú thích cấu trúc sang SSDL. Tất cả các chú thích đều có thể truy cập được trong siêu dữ liệu thông qua một số bộ sưu tập giá trị tên. Bây giờ bạn cần sửa đổi mẫu T4 chịu trách nhiệm tạo tập lệnh SQL để nhận ra chú thích này và sử dụng giá trị được xác định trong chú thích thay vì loại được xác định trong thuộc tính. Bạn có thể tìm thấy mẫu trong:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\SSDLToSQL10.tt

Sao chép tệp mẫu sang vị trí mới (để bạn không sửa đổi tệp gốc) và thay thế tạo bảng mặc định bằng:

-- Creating table '<#=tableName#>'
CREATE TABLE <# if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=tableName#>] (
<#
        for (int p = 0; p < entitySet.ElementType.Properties.Count; p++)
        {
            EdmProperty prop = entitySet.ElementType.Properties[p];
#>
    [<#=Id(prop.Name)#>] <#
            if (prop.MetadataProperties.Contains("http://tempuri.org/custom:SqlType"))
            {
                MetadataProperty annotationProperty = prop.MetadataProperties["http://tempuri.org/custom:SqlType"];
                XElement e = XElement.Parse(annotationProperty.Value.ToString());
                string value = e.Value.Trim();
    #>
    <#=value#> <# } else { #> <#=prop.ToStoreType()#> <# } #> <#=WriteIdentity(prop, targetVersion)#> <#=WriteNullable(prop.Nullable)#><#=(p < entitySet.ElementType.Properties.Count - 1) ? "," : ""#>
<#
        }
#>
);
GO

Bây giờ, điểm cuối cùng là thay đổi mẫu được sử dụng để tạo tập lệnh SQL. Mở tệp EDMX trong trình thiết kế và đi đến thuộc tính của mô hình (chỉ cần nhấp vào một nơi nào đó trong trình thiết kế khi bạn mở cửa sổ thuộc tính). Thay đổi Mẫu tạo DDL thành mẫu bạn đã sửa đổi.

Chạy Tạo cơ sở dữ liệu từ mô hình và nó sẽ tạo tập lệnh SQL chứa:

-- Creating table 'UsersSet'
CREATE TABLE [dbo].[UsersSet] (
    [Id]  int  IDENTITY(1,1) NOT NULL,
    [Login]  nvarchar(max)   NOT NULL,
    [CreatedAt]     Date   NOT NULL
);
GO

Đây có lẽ là tính năng tiên tiến và ẩn nhất của EDMX mà tôi từng thấy. Chú thích cùng với các mẫu T4 tùy chỉnh có thể giúp bạn kiểm soát rất nhiều đối với cả lớp và thế hệ SQL. Tôi có thể tưởng tượng bằng cách sử dụng điều này để xác định ví dụ:chỉ mục cơ sở dữ liệu hoặc khóa duy nhất khi sử dụng mô hình trước tiên hoặc thêm có chọn lọc một số thuộc tính tùy chỉnh vào các lớp POCO đã tạo.

Lý do tại sao điều này rất ẩn là không có công cụ hỗ trợ trong VS out-of-the box để sử dụng điều này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng kết quả của câu lệnh SQL select trong hàm dbo.fnSplit làm đầu vào

  2. THỬ MÈO với máy chủ được liên kết trong SQL Server 2005 không hoạt động

  3. Làm cách nào để thông báo cho chương trình của tôi khi cơ sở dữ liệu đã được cập nhật?

  4. Tại sao máy chủ SQL gặp lỗi này:Không thể chèn giá trị NULL vào cột 'id'?

  5. Cài đặt phiên bản cụm chuyển đổi dự phòng SQL Server - Phần 1