Entity framework多數據庫切換支持


在此,以支持SQL2008和ORACLE為例:
1、設計數據庫各個表,請注意兩個數據庫各個表生成.net對應實體的數據類型必須保證會一致,因為各個數據庫共用的是一個實體,這就要求對各個數據庫的字段類型通過EF生成實體的數據類型要非常的了解;
2、 建立好數據庫后,選擇其中一種類型數據庫(此處選擇ORACLE數據庫),創建ADO.NET實體數據類型(此處命名為TestModel),並保存;
3、至此,我們有了Web.config的數據庫連接相關配置、
TestModel.edmx和TestModel.Designer.cs兩個文件;
4、現在,我們通過程序支持SQL2008數據庫,首先,需要手動創建存儲模型文件,在項目中新建名為TestModel.SqlServer.ssdl 的xml文件。然后右擊TestModel.edmx選擇XML(文本)編輯器,將<!-- SSDL content -->之后介於 <edmx:StorageModels> … </edmx:StorageModels>之間的內容拷貝至新建的TestModel.SqlServer.ssdl文件中,這樣TestModel.SqlServer.ssdl的內容應該如下:

<?xml version="1.0" encoding="utf-8" ?>
<Schema Namespace="OracleModel.Store" Alias="Self" Provider="Oracle.DataAccess.Client" ProviderManifestToken="11.2" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
  <EntityContainer Name="OracleModelStoreContainer">
    <EntitySet Name="DEPARTMENTINFO" EntityType="OracleModel.Store.DEPARTMENTINFO" store:Type="Tables" Schema="LDSA" />
    <EntitySet Name="USERINFO" EntityType="OracleModel.Store.USERINFO" store:Type="Tables" Schema="LDSA" />
    <AssociationSet Name="部門外鍵" Association="OracleModel.Store.部門外鍵">
      <End Role="DEPARTMENTINFO" EntitySet="DEPARTMENTINFO" />
      <End Role="USERINFO" EntitySet="USERINFO" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="DEPARTMENTINFO">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="number" Nullable="false" Precision="10" />
    <Property Name="NAME" Type="nvarchar2" Nullable="false" MaxLength="20" />
  </EntityType>
  <EntityType Name="USERINFO">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="number" Nullable="false" Precision="10" />
    <Property Name="NAME" Type="nvarchar2" Nullable="false" MaxLength="20" />
    <Property Name="DEPARTID" Type="number" Nullable="false" Precision="10" />
    <Property Name="CREATEDATE" Type="date" />
  </EntityType>
  <Association Name="部門外鍵">
    <End Role="DEPARTMENTINFO" Type="OracleModel.Store.DEPARTMENTINFO" Multiplicity="1">
      <OnDelete Action="Cascade" />
    </End>
    <End Role="USERINFO" Type="OracleModel.Store.USERINFO" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="DEPARTMENTINFO">
        <PropertyRef Name="ID" />
      </Principal>
      <Dependent Role="USERINFO">
        <PropertyRef Name="DEPARTID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
</Schema>

 5、接着修改 TestModel.SqlServer.ssdl 存儲模型文件,使之能與匹配Sql Server 2008數據庫表。首先我們需要將 Provider 和 ProviderManifestToken修改為:

Provider= "System.Data.SqlClient"   ProviderManifestToken= "2008"
這表示該存儲模型是基於 Sql Server 2008 數據庫的。然后將各個字段的 Type 修改為Sql Server 2008支持的數據類型(各個數據庫肯定有類型不一樣的,同時包括外鍵關系的名稱也要注意)
<?xml version="1.0" encoding="utf-8" ?>
<Schema Namespace="OracleModel.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="OracleModelStoreContainer">
    <EntitySet Name="DEPARTMENTINFO" EntityType="OracleModel.Store.DEPARTMENTINFO" store:Type="Tables" Schema="dbo" />
    <EntitySet Name="USERINFO" EntityType="OracleModel.Store.USERINFO" store:Type="Tables" Schema="dbo" />
    <AssociationSet Name="部門外鍵" Association="OracleModel.Store.部門外鍵">
      <End Role="DEPARTMENTINFO" EntitySet="DEPARTMENTINFO" />
      <End Role="USERINFO" EntitySet="USERINFO" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="DEPARTMENTINFO">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="int" Nullable="false"  StoreGeneratedPattern="Identity" />
    <Property Name="NAME" Type="nvarchar" Nullable="false" MaxLength="20" />
  </EntityType>
  <EntityType Name="USERINFO">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="int" Nullable="false"  StoreGeneratedPattern="Identity"/>
    <Property Name="NAME" Type="nvarchar" Nullable="false" MaxLength="20" />
    <Property Name="DEPARTID" Type="int" Nullable="false" />
    <Property Name="CREATEDATE" Type="date" />
  </EntityType>
  <Association Name="部門外鍵">
    <End Role="DEPARTMENTINFO" Type="OracleModel.Store.DEPARTMENTINFO" Multiplicity="1">
      <OnDelete Action="Cascade" />
    </End>
    <End Role="USERINFO" Type="OracleModel.Store.USERINFO" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="DEPARTMENTINFO">
        <PropertyRef Name="ID" />
      </Principal>
      <Dependent Role="USERINFO">
        <PropertyRef Name="DEPARTID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
</Schema>

6、最后Web.config增加sql2008數據庫連接如下: 
oracle:(
創建ADO.NET實體數據類型自動生成)

<!--<add name="DBEntities" connectionString="metadata=res://*/Models.TestModel.csdl|res://*/Models.TestModel.ssdl|res://*/Models.TestModel.msl;provider=Oracle.DataAccess.Client;provider connection string="DATA SOURCE=//192.168.16.155/testdb;PASSWORD=123456;PERSIST SECURITY INFO=True;USER ID=LDSA"" providerName="System.Data.EntityClient" />-->
 sql2008:
<add name="DBEntities" connectionString="metadata=res://*/Models.TestModel.csdl|~/Models/TestModel.SqlServer.ssdl|res://*/Models.TestModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=ZHANGDEYI-PC\ADESQL;Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=123456;"" providerName="System.Data.EntityClient" />

 提示: ~/Models/TestModel.SqlServer.ssdl 存放TestModel.SqlServer.ssdl的路徑
總結:上面的過程是先建立一致的數據庫表,然后選擇一種數據庫生成概念模型,存儲模型以及映射關系,然后拷貝並修改存儲模型,使之與其他數據庫匹配,從而完成對多數據庫的支持。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM