5

我在两台服务器上有两个数据库。我的应用程序主要在 server1 上使用 db1。但是,我只会在 server2 上的 db2 中读取一张表。

我们没有为 db2 创建一个新的 DbContext,而是创建了一个链接服务器并在 db1 中为该表设置了一个同义词。我在我的 db1 Code First 上下文中为此设置了映射。这似乎有效,我可以检索数据。

但是,如果我在谓词中使用任何日期,则会收到以下错误:

A failure occurred while giving parameter information to OLE DB provider "SQLNCLI10" for linked server "server2".

我的映射如下所示:

ToTable("synonym");

Property(t => t.Id).HasColumnName("ID");
Property(t => t.Company).HasColumnName("Company");
Property(t => t.StartDate).HasColumnName("StartDate");
Property(t => t.EndDate).HasColumnName("EndDate");
Property(t => t.LastUpdatedDate).HasColumnName("LastUpdatedDate");
Property(t => t.LastUpdatedBy).HasColumnName("LastUpdatedBy");

我正在尝试运行以下查询:

_context.Set<Synonym>()
    .Any(s => s.Company == company
            && s.StartDate <= date
            && (s.EndDate >= date || s.EndDate == null));

如果我删除日期,查询运行良好。

server1 是 SQL 2008
server2 是 SQL 2005

我发现这个线程表明日期存在某种问题,但我不知道如何将其应用于实体框架。

4

3 回答 3

5

我们使用具有以下星座的Entity Framework 6遇到了同样的问题:

  • Server1 (="ours"): MS SQL Server 2008 R2
  • 链接 Server2 (="theirs"): MS SQL Server (未知版本大概是 2005)

我们对“我们的”服务器有一个视图,看起来像这样:

CREATE VIEW [ourSchema].[SomeEntity]
AS
SELECT 
    [Id]
    ,...
    ,[StartTime]
    ,[EndTime]
FROM [SERVER2].[someDb].[theirSchema].[someTable]

链接服务器上的表如下所示:

CREATE TABLE [schema2].[table]
(
    [Id] [int] NOT NULL,
    ,...
    [StartTime] [datetime] NOT NULL,
    [EndTime] [datetime] NULL
) ON PRIMARY

通过反向 POCO 创建创建的模型和配置:

public partial class SomeEntity
{
    public int Id { get; set; }
    public ...
    public DateTime StartTime { get; set; }
    public DateTime? EndTime { get; set; }
}
public partial class SomeEntityConfiguration : EntityTypeConfiguration<TestBedData>
{
    public SomeEntityConfiguration(string schema = "ourSchema")`
    {
        ToTable(schema + ".SomeEntity");
        HasKey(someLambdaExpression);
        Property(x => x.Id).HasColumnName("Id").IsRequired();
        Property(x => ...);
        Property(x => x.StartTime).HasColumnName("StartTime").IsRequired();
        Property(x => x.EndTime).HasColumnName("EndTime").IsOptional();
        InitializePartial();
    }
    partial void InitializePartial();
}

任何涉及StartTimeEndTime属性的查询都会导致初始帖子中描述的异常:

向链接服务器“Server2”的 OLE DB 提供程序“SQLNCLI10”提供参数信息时出错。

在花了几个小时了解潜在问题后,我偶然发现了以下问题:

.NET 中的 DateTime 类型与 SQL Server 中的 datetime2 具有相同的范围和精度。当 EF 在 SQL Server 中插入或更新 datetime 或 datetime2 列时,它会将模型属性转换为可以在 .NET 中保存整个 DateTime 范围的类型,即 datetime2。关联

对比MS SQL Server 2008 R22005不同版本支持的数据类型最终发现问题:

C# 中的 DateTime -> 通过 EF 转换 -> SQL 中的DateTime2,因为我们正在与 SQL Server 2008 R2 上的“我们的”视图进行通信。但是查询被转发到不支持DateTime2数据类型的“他们的”链接服务器。

CREATE VIEW [ourSchema].[SomeEntity]
AS
SELECT 
    [Id]
    ,...
    ,CAST([StartTime] AS datetime2)
    ,CAST([EndTime] AS datetime2)
FROM [SERVER2].[someDb].[theirSchema].[someTable]

成功了。

于 2014-08-08T13:32:51.693 回答
0

我有同样的问题,我最终使用了ExecuteStoreQuery方法。

string formatter = "{0:yyyy/MM/dd}";

string start = String.Format(formatter, startDate);
string end = String.Format(formatter, endDate);

string sampleStatement = "SELECT * FROM Synonym WHERE StartDate >= '" + start + "' and EndDate <='" + end + "'";

var result = _context.ExecuteStoreQuery<Synonym>(sampleStatement, null).ToList();

我希望这种方法有所帮助。

于 2012-08-22T18:35:44.527 回答
0

PI OLEDB Enterprise Linked Server View 和 SQL Stored Proc 参数均设置为 DateTime。我们将存储的过程切换到 DateTime2 并修复了错误。

于 2020-09-09T19:34:17.880 回答