无法使用EntityFramework.IBM.DB2

时间:2016-04-04 22:44:10

标签: c# entity-framework informix

我在使用 EntityFramework.IBM.DB2(v6.0.3)程序包从.Net 4.5.2应用程序连接到Informix数据库时遇到问题。当我尝试查询数据库时,我不断收到以下错误:

  

System.NotSupportedException:没有与之对应的商店类型   EDM类型' Edm.String'原始类型'字符串'。

抛出错误的一行是:

var existing = db
    .MyEntities
    .FirstOrDefault(e => e.IdB == myId);

实体本身:

public class MyEntity
{
    public long IdA { get; set; }

    public long IdB { get; set; }

    public string NameA { get; set; }

    public string NameB { get; set; }

    public ICollection<OtherEntity> OtherEntities { get; set; }
}

用于创建表格的脚本:

create table myentity (
  idA BIGINT not null,
  idB BIGINT not null,
  nameA NVARCHAR(200) not null,
  nameB NVARCHAR(200) not null
)
extent size 32 next size 32
lock mode page;

alter table myentity add constraint primary key 
  (idB)
  constraint pk_myentity;

表格配置:

public class MyEntityConfig : EntityTypeConfiguration<MyEntity>
{
    public EventTypeConfig()
    {
        ToTable("MyEntity");
        HasKey(u => u.IdB);
        Property(u => u.IdB).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        Property(s => s.IdA).IsRequired();
        Property(s => s.NameA).IsRequired().HasMaxLength(200);
        Property(s => s.NameB).IsRequired().HasMaxLength(200);

        HasOptional(e => e.OtherEntities);
        HasMany(e => e.OtherEntities);
    }
}

当我运行testconn40时,我接受了测试通过,所以我认为这不是连接到数据库的问题。我还有另一个项目使用非常类似的设置,所以我不知道出了什么问题。

任何人都可以提供有关此特定错误的任何帮助或信息。非常感谢。

2 个答案:

答案 0 :(得分:2)

此错误是由于.Net类型如何映射到数据库类型。

我的一个数据库表中有一个类型LVARCHAR(32000)的字段,我的实体上的相应字段是string。我将数据库中的字段更新为NCHAR(32000),并将以下内容添加到我的实体配置类中:

Property(s => s.StringProp).HasMaxLength(32000).IsRequired();

一旦我做了这些更改,错误就消失了。

我遇到的另一个奇怪的错误是:

  

System.NotSupportedException:没有与之对应的商店类型   EDM类型&#39; Edm.Guid&#39;原始类型&#39; Guid&#39;。

Informix似乎不支持Guid类型;我使用VARCHAR(36)并在插入和检索时在Guid和字符串之间进行映射,所以这个错误很奇怪。事实证明,这取决于我如何使用LINQ查询。

此行引发错误:

var dbEntity = dbContext
    .MyEntities
    .FirstOrDefault(e => e.Id == myGuid.ToString());

这在哪里工作正常:

var id = myGuid.ToString();

var dbEntity = dbContext
    .MyEntities
    .FirstOrDefault(e => e.Id == id);

基本上我发现的是,当您尝试使用EntityFramework.IBM.DB2做任何事情时,您必须尽可能简单明了地保持一切,否则您将继续遇到隐秘的错误或不支持在网上找到。

希望这有助于将来。

答案 1 :(得分:0)

EF支持仅使用IBM DB2客户端驱动程序。 由于IBM DB2客户端驱动程序使用DRDA协议,因此 需要启用带有IDS服务器的DRDA端口,然后才能工作。

IBM DB2 Client团队在developerworks论坛上更加活跃。 如果您仍然遇到问题,可以将其重新发布到developerworks上,网址为

https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000000467