cad*_*ll0 5 sql-server entity-framework
我在两台服务器上有两个数据库.我的应用程序主要在server1上使用db1.但是,有一个表我只会在server2上的db2中读取.
我们创建了一个链接服务器,并在db1中为该表设置了一个同义词,而不是为db2创建一个新的DbContext.我在db1 Code First Context中为此设置了映射.这似乎工作,我可以检索数据.
但是,如果我在谓词中使用任何日期,则会收到以下错误:
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");
Run Code Online (Sandbox Code Playgroud)
我正在尝试运行以下查询:
_context.Set<Synonym>()
.Any(s => s.Company == company
&& s.StartDate <= date
&& (s.EndDate >= date || s.EndDate == null));
Run Code Online (Sandbox Code Playgroud)
如果我删除日期,查询运行正常.
server1是SQL 2008
server2是SQL 2005
我发现这个帖子表明日期存在某种问题,但我无法弄清楚如何将其应用于Entity Framework.
小智 5
我们使用以下星座使用Entity Framework 6遇到了同样的问题:
我们对"我们的"服务器有一个看法,看起来像这样:
CREATE VIEW [ourSchema].[SomeEntity]
AS
SELECT
[Id]
,...
,[StartTime]
,[EndTime]
FROM [SERVER2].[someDb].[theirSchema].[someTable]
Run Code Online (Sandbox Code Playgroud)
链接服务器上的表格如下所示:
CREATE TABLE [schema2].[table]
(
[Id] [int] NOT NULL,
,...
[StartTime] [datetime] NOT NULL,
[EndTime] [datetime] NULL
) ON PRIMARY
Run Code Online (Sandbox Code Playgroud)
通过反向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();
}
Run Code Online (Sandbox Code Playgroud)
任何涉及StartTime或EndTime属性的查询都会导致初始帖子中描述的异常:
同时给予参数信息OLE DB提供程序"SQLNCLI10"链接服务器"服务器2"出现故障.
在花了几个小时了解潜在问题后,我偶然发现了以下问题:
.NET中的DateTime类型与SQL Server中的datetime2具有相同的范围和精度.当EF在SQL Server中插入或更新datetime或datetime2列时,它会将model属性转换为可以在.NET中保存整个DateTime范围的类型,即datetime2.链接
比较不同的MS SQL Server版本的支持的数据类型2008 R2和2005年终于露出了问题:
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]
Run Code Online (Sandbox Code Playgroud)
做了伎俩.
小智 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();
Run Code Online (Sandbox Code Playgroud)
我希望这种方法有所帮助。
| 归档时间: |
|
| 查看次数: |
1752 次 |
| 最近记录: |