【问题标题】:Entity Framework 4.1 code first with a DB2 Linked Server in SQLEntity Framework 4.1 代码首先使用 SQL 中的 DB2 链接服务器
【发布时间】:2011-08-31 13:25:55
【问题描述】:

我想使用 Entity Framework 4.1 Code-First 来建立与我的数据库的连接,无论它们是在我们的 SQL 服务器还是 DB2 上。我觉得我快到了,但就是无法让它发挥作用。

我们正在使用 SQL 2005,并为我们的 DB2 大型机设置了一个链接服务器,称为 ISERIES DATA。

这是我的实体对象:

using System;
using System.ComponentModel.DataAnnotations;

namespace HOP.Infrastructure.Model
{
    [Table("EDIHA101_DEMO")]
    public class EDIHA101
    {
        [Key, Column(Order = 0)]
        public int HABCH { get; set; }

        [Key, Column(Order = 1)]
        public int HABSQ { get; set; }

        public int HAVND { get; set; }
        public string HACUS { get; set; }
        public string HAPRD { get; set; }
        public string HADSC { get; set; }
        public string HAUOM { get; set; }
        public string HADCK { get; set; }
        public string HALDT { get; set; }
        public string HALTM { get; set; }
        public int HAQQY { get; set; }
        public int HACQY { get; set; }
        public int HAOQY { get; set; }
        public int HAPON { get; set; }
        public string HACMT { get; set; }
        public string HAADT { get; set; }
        public string HAATM { get; set; }
        public string HADTP { get; set; }
        public string HADID { get; set; }
        public int HAALN { get; set; }
        public int HAMDL { get; set; }
        public int HAAS1 { get; set; }
        public string HARDT { get; set; }
        public string HARTM { get; set; }
        public int HARQY { get; set; }
        public int HANQY { get; set; }
        public int HADBL { get; set; }
        public int HARSQ { get; set; }
        public int HAASN { get; set; }
        public int HABOL { get; set; }
        public string HADWG { get; set; }
        public string HAREV { get; set; }
        public string HACBY { get; set; }
        public string HACDT { get; set; }
        public string HACTM { get; set; }
        public string HAFDT { get; set; }
        public string HAFTM { get; set; }
        public string HACD1 { get; set; }
    }
}

类的 Table 属性指向我创建的用于公开 DB2 表的 VIEW。我可以从 SQL 管理工作室对此视图运行 SELECT 查询,它会返回数据。

这是正在使用的数据上下文:

using System.Data.Entity;

namespace HOP.Infrastructure.Model
{
    public class EDIDataContext : DbContext
    {
        public DbSet<EDIHA101> EDIHA101 { get; set; }

        public EDIDataContext(string connectionString) 
            : base(connectionString)
        {

        }
    }
}

这里是使用 Create 方法尝试创建新记录的存储库:

using HOP.Core.Interfaces;
using HOP.Infrastructure.Mappings;
using HOP.Infrastructure.Model;
using Domain = HOP.Core.Domain;
using Model  = HOP.Infrastructure.Model;

namespace HOP.Infrastructure.Repositories
{
    public class ItemRepository : IItemRepository
    {
        protected EDIDataContext db;

        public ItemRepository(EDIDataContext db)
        {
            this.db = db;
        }

        public void Create(Domain.Item item)
        {
            Model.EDIHA101 edi = item.Map();

            db.EDIHA101.Add(edi);
            db.SaveChanges();
        }
    }
}

这是连接字符串:

<add name="Development_AS400" connectionString="Data Source=SERVER_NAME;Initial Catalog=ISERIES DATA;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

当我在存储库代码中执行 Create 方法时,我在 db.SaveChanges() 行上得到了这个异常:

"由于 OLE DB 无法执行请求的操作 链接服务器 \"ISERIES\" 的提供程序 \"DB2OLEDB\" 不支持 所需的交易接口。”

我发现这篇文章建议在 DB2 上打开日记功能:

http://www.sqlservercentral.com/Forums/Topic265107-289-1.aspx

我们的 DB2 DBA 不想启用日记功能,那么我可以在 EF 中以某种方式禁用事务吗?或者,还有什么我可以尝试的吗?

谢谢!

【问题讨论】:

    标签: db2 entity-framework-4.1 linked-server


    【解决方案1】:

    有什么原因你不能直接连接到服务器。您收到的错误表明不受支持的数据提供者没有记录我唯一能想到的其他建议是使用复制而不是链接服务器,因为我不能 100% 确定在 ef4 中直接支持链接服务器/oledb 或 odac。 1 我知道有一些 3rd 方提供商,例如 devart 的 dot connect 将支持这些,但是他们确实需要额外的费用

    【讨论】:

    • 根据我的经验,未记录的数据库只会生成警告,不应导致此类错误,因为 Ed 很简单,生成简单的 SQL 语句
    • 我可以直接连接到 DB2 服务器,但是需要在开发人员和服务器上加载驱动程序。我们刚刚遇到了一个问题,在服务器上更新该驱动程序将要求我们更新使用该驱动程序的所有应用程序。我们宁愿使用链接服务器,因为我们所有的开发工作都将使用相同的连接方法。
    • 如果 EF 4.1 不支持 DB2,Linq To SQL 会更好吗?
    • 通过直接连接我的意思是 - 我可以使用 .net 提供程序打开连接来连接到 DB2。我不确定您的意思是直接使用 EF 连接吗?
    • oledb 和 db2 连接不支持开箱即用。但它可以与 dotconnect 等 3rd 方驱动程序一起使用,但需要额外费用
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多