Сначала код Entity Framework 4.1 с использованием связанного сервера DB2 в SQL - PullRequest
0 голосов
/ 31 августа 2011

Я хотел бы использовать Entity Framework 4.1 Code-First для создания соединений с моими базами данных, независимо от того, находятся ли они на нашем сервере SQL или DB2.Я чувствую, что я почти на месте, но просто не могу заставить его работать.

Мы используем SQL 2005 и настроили Linked Server для нашего мэйнфрейма 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 в классе указывает на VIEW, который я создал для представления таблицы DB2.Я могу запускать запросы SELECT для этого представления из SQL Management Studio, и он возвращает данные.

Вот используемый контекст данных:

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 \" DB2OLEDB \ "для связанного сервера \" ISERIES \ "не поддерживает требуемый интерфейс транзакции."

Я нашел этот пост, в котором предлагается включить ведение журнала в DB2:

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

Наш администратор DB2 не хочет включать ведение журнала, поэтому я могу как-то отключить транзакции в EF?Или есть что-то еще, что я могу попробовать?

Спасибо!

1 Ответ

1 голос
/ 01 сентября 2011

Есть ли причина, по которой вы не можете подключиться к серверу напрямую. Получаемая ошибка указывает на то, что неподдерживаемый поставщик данных не ведет журнал. Единственное мое другое предложение, о котором я могу подумать, - это использовать репликацию вместо связанных серверов, так как я не уверен на 100%, что связанные серверы / oledb или odac напрямую поддерживаются "из коробки" в ef4. 1 Я знаю, что есть некоторые сторонние провайдеры, такие как dot connect от devart, которые будут поддерживать их, однако к ним добавлены дополнительные расходы

...