zoukankan      html  css  js  c++  java
  • 如何使用ASP.NET Web API OData在Oracle中使用Entity Framework 6.x Code-First方式开发 OData V4 Service

    环境: Visual Studio 2013 + .Net Framework 4.5.2

    1.新建项目

    2.安装OData,ODP.NET

    安装的包:

    下面是部分代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace WebAppOdataEF.Models
    {
        public class AUDIT_TEMPLATE
        {
            /// <summary>
            /// Gets or sets the identifier.
            /// 自增ID
            /// </summary>
            /// <value>The identifier.</value>
            public decimal ID { get; set; }
    
            /// <summary>
            /// Gets or sets the audit template no.
            /// 审批模板编码
            /// </summary>
            /// <value>The audit template no.</value>
            public string AUDITTEMPLATENO { get; set; }
    
            /// <summary>
            /// Gets or sets the name of the audit template.
            /// 审批模板名称
            /// </summary>
            /// <value>The name of the audit template.</value>
            public string AUDITTEMPLATENAME { get; set; }
    
            /// <summary>
            /// Gets or sets the bill type no.
            /// 单据类型
            /// </summary>
            /// <value>The bill type no.</value>
            public string BILLTYPENO { get; set; }
    
            /// <summary>
            /// Gets or sets the remark.
            /// 备注
            /// </summary>
            /// <value>The remark.</value>
            public string REMARK { get; set; }
    
            /// <summary>
            /// Gets or sets the template status.
            /// 状态1有效 0无效
            /// </summary>
            /// <value>The template status.</value>
            public decimal TEMPLATESTATUS { get; set; }
    
            /// <summary>
            /// Gets or sets the company no.
            /// 公司编码
            /// </summary>
            /// <value>The company no.</value>
            public string COMPANYNO { get; set; }
    
            /// <summary>
            /// Gets or sets the create time.
            /// 创建时间
            /// </summary>
            /// <value>The create time.</value>
            public DateTime CREATETIME { get; set; }
    
            /// <summary>
            /// Gets or sets the create user no.
            /// 创建人
            /// </summary>
            /// <value>The create user no.</value>
            public string CREATEUSERNO { get; set; }
    
            /// <summary>
            /// Gets or sets the update time.
            /// 更新时间
            /// </summary>
            /// <value>The update time.</value>
            public DateTime UPDATETIME { get; set; }
    
            /// <summary>
            /// Gets or sets the update user no.
            /// 更新人
            /// </summary>
            /// <value>The update user no.</value>
            public string UPDATEUSERNO { get; set; }
        }
    }
    

    这个是实体代码,类名称和属性名称要和数据库中的表结构表名和字段名称一样,大小写都一样。

    EF Context代码:

    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;
    using System.Linq;
    using System.Web;
    
    namespace WebAppOdataEF.Models
    {
        public class TemplatesContext : DbContext
        {
            static TemplatesContext()
            {
                Database.SetInitializer<TestsContext>(null);
                //Database.SetInitializer(new CreateDatabaseIfNotExists<TestsContext>());
                //Database.SetInitializer(new DropCreateDatabaseAlways<TestsContext>());
                //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TestsContext>());
            }
    
            /// <summary>
            /// Initializes a new instance of the <see cref="TemplatesContext"/> class.
            /// </summary>
            public TemplatesContext()
                : base("name=SysBasicOracleDbContext")
            {
                this.Configuration.LazyLoadingEnabled = false;
            }
    
            /// <summary>
            /// Gets or sets the templates.
            /// </summary>
            /// <value>The templates.</value>
            public DbSet<AUDIT_TEMPLATE> Templates { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.HasDefaultSchema("TEST");
                modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
                modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }
        }
    }
    

      这里是你的用户,

    "TEST" 一定要大写
    modelBuilder.HasDefaultSchema("TEST");

    Controller部分代码:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    using System.Web.OData;
    using WebAppOdataEF.Models;
    
    namespace WebAppOdataEF.Controllers
    {
        public class TemplatesController : ODataController
        {
            TemplatesContext db = new TemplatesContext();
            private bool TestExists(int key)
            {
                return db.Templates.Any(p => p.ID == key);
            }
            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
    
            [EnableQuery]
            public IHttpActionResult Get()
            {
                return Ok(db.Templates);
            }
    
            [EnableQuery]
            public SingleResult<AUDIT_TEMPLATE> Get([FromODataUri] int key)
            {
                IQueryable<AUDIT_TEMPLATE> result = db.Templates.Where(p => p.ID == key);
                return SingleResult.Create(result);
            }
        }
    }
    

      

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    using WebAppOdataEF.Models;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Threading.Tasks;
    using System.Web.OData;
    
    namespace WebAppOdataEF.Controllers
    {
        public class TestsController : ODataController
        {
            TestsContext db = new TestsContext();
            private bool TestExists(int key)
            {
                return db.Tests.Any(p => p.ID == key);
            }
            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
    
            [EnableQuery]
            public IHttpActionResult Get()
            {
                return Ok(db.Tests);
            }
    
            [EnableQuery]
            public SingleResult<TESTS> Get([FromODataUri] int key)
            {
                IQueryable<TESTS> result = db.Tests.Where(p => p.ID == key);
                return SingleResult.Create(result);
            }
    
            public async Task<IHttpActionResult> Post(TESTS product)
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }
                db.Tests.Add(product);
                await db.SaveChangesAsync();
                return Created(product);
            }
    
            public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<TESTS> product)
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }
                var entity = await db.Tests.FindAsync(key);
                if (entity == null)
                {
                    return NotFound();
                }
                product.Patch(entity);
                try
                {
                    await db.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!TestExists(key))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return Updated(entity);
            }
    
            public async Task<IHttpActionResult> Put([FromODataUri] int key, TESTS update)
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }
                if (key != update.ID)
                {
                    return BadRequest();
                }
                db.Entry(update).State = EntityState.Modified;
                try
                {
                    await db.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!TestExists(key))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return Updated(update);
            }
    
            public async Task<IHttpActionResult> Delete([FromODataUri] int key)
            {
                var product = await db.Tests.FindAsync(key);
                if (product == null)
                {
                    return NotFound();
                }
    
                db.Tests.Remove(product);
                await db.SaveChangesAsync();
                return StatusCode(HttpStatusCode.NoContent);
            }
        }
    }
    

      WebApiConfig代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Http;
    using WebAppOdataEF.Models;
    using System.Web.OData.Builder;
    using System.Web.OData.Extensions;
    
    namespace WebAppOdataEF
    {
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
                ODataModelBuilder builder = new ODataConventionModelBuilder();
                builder.EntitySet<TESTS>("Tests");
                builder.EntitySet<TB_MENU>("TbMenus");
                builder.EntitySet<AUDIT_TEMPLATE>("Templates");
                config.MapODataServiceRoute(
                    routeName: "ODataRoute",
                    routePrefix: null,
                    model: builder.GetEdmModel());
    
                // Web API 路由
                //config.MapHttpAttributeRoutes();
    
                //config.Routes.MapHttpRoute(
                //    name: "DefaultApi",
                //    routeTemplate: "api/{controller}/{id}",
                //    defaults: new { id = RouteParameter.Optional }
                //);
            }
        }
    }
    

      WebApiApplication代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Http;
    using System.Web.Routing;
    
    namespace WebAppOdataEF
    {
        public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }
        }
    }
    

      WebConfig文件:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=301879
      -->
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        <!--<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />-->
      </configSections>
      <appSettings></appSettings>

    <!--<connectionStrings>
    <add name="TestsContext" providerName="Oracle.ManagedDataAccess.Client"
    connectionString="User Id=system;Password=111111;Data Source=XE"/>
    <add name="SysBasicOracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=test;Password=test;Data Source=test" />
    </connectionStrings>-->


    <connectionStrings>
    <add name="SysBasicOracleDbContext" connectionString="Data Source= (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = test)
        )
      );User ID=test;Password=test;Persist Security Info=True" providerName="Oracle.ManagedDataAccess.Client" />
    
      </connectionStrings>
        <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
      <system.data>
        <DbProviderFactories>
          <remove invariant="Oracle.ManagedDataAccess.Client" />
          <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver"
              type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
        </DbProviderFactories>
    </system.data>
      <system.webServer>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <!--<oracle.manageddataaccess.client>
        <version number="*">
          <dataSources>
            <dataSource alias="XE" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE))) "/>
            <dataSource alias="test" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=test))) " />
          </dataSources>
        </version>
      </oracle.manageddataaccess.client>-->
      <entityFramework>
        <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>-->
        <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory,
          Oracle.ManagedDataAccess.EntityFramework,
          Version=6.121.2.0,
          Culture=neutral,
          PublicKeyToken=89b483f429c47342" />
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
          <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices,Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
        </providers>
      </entityFramework>
    </configuration>
    

      

    运行结果:

    http://localhost:54577/Templates

    http://localhost:54577/Templates(7)

    http://localhost:54577/Templates?$count=true

    http://localhost:54577/Templates?$count=true&$select=ID,REMARK

    http://localhost:54577/Templates?$count=true&$select=ID,REMARK&$top=2&$skip=1

    http://localhost:54577/Templates?$count=true&$select=ID,REMARK&$top=2&$skip=1&$orderby=ID%20desc

    http://localhost:54577/Templates?$count=true&$filter=AUDITTEMPLATENO%20eq%20%27t5%27

    请参考Odata.org官网:

    基础操作:

    http://www.odata.org/getting-started/basic-tutorial/#filter

    高级操作:

    http://www.odata.org/getting-started/advanced-tutorial/

    Github地址:

    http://odata.github.io/

    https://github.com/OData/RESTier

    参考文章:

    二篇教程(英文版):

    1.Using NuGet to Install and Configure Oracle Data Provider for .NET

    2.Entity Framework Code First and Code First Migrations for Oracle Database

    http://www.cnblogs.com/yjmyzz/p/how-to-use-code-first-in-oracle-with-entity-framework-6.html

    http://www.cnblogs.com/shanyou/archive/2010/02/19/1669360.html

    http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

    http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity-framework/

  • 相关阅读:
    Java知多少(57)主线程
    Java知多少(56)线程模型
    Java知多少(55)线程
    Java知多少(54)断言详解
    Java知多少(53)使用Java创建自己的异常子类
    Java知多少(52)内置异常
    Java知多少(51)finally
    Java知多少(50)Java throws子句
    Java知多少(49)throw:异常的抛出
    Java知多少(48)try语句的嵌套
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4618930.html
Copyright © 2011-2022 走看看