PetaPoco POCO 生成失败,序列包含多个匹配元素
Posted
技术标签:
【中文标题】PetaPoco POCO 生成失败,序列包含多个匹配元素【英文标题】:PetaPoco POCO generation fails with Sequence Contains More Then One Matching Element 【发布时间】:2017-05-03 22:03:55 【问题描述】:PostgreSQL 9.5 Npgsql 3.1.9
我一直在使用 PetaPoco 和 Npgsql 来生成带有 Database.tt 的 POCO。直到今天,一切都运作良好。在 PostgreSQL 中重新制作架构后,现在运行 Database.tt 会出现错误:
// 该文件由 PetaPoco T4 模板自动生成
// 不要直接更改此文件 - 改为编辑模板
//以下连接设置用于生成此文件
// 连接字符串名称:
localconnection
// 提供者:
Npgsql
// 连接字符串:
Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;password=**zapped**;Searchpath=nova
// 架构:``
// 包括视图:
False
//
// 读取数据库架构失败 - 序列包含多个匹配元素
我在 Google 中找不到该地址: 这意味着什么(对于 PetaPoco),为什么会发生,我该如何解决?
TIA
Edit#1:如果有帮助的话,在逐步完成 T4 模板时,_factory 类型 解析为 SQL Server CE --not NpgsqlFactory -- 尽管有正确的连接字符串。
_factory.GetType().Name == "SqlCeProviderFactory"
Edit#2:通过在 PetaPoco.Core.ttinclude 中重写 LoadTables(),将
else if (_factory.GetType().Name == "NpgsqlFactory")
Edit#3:现在回到 PetaPoco v 5.1.211,还是同样的错误???
问题似乎出在 LoadTables() 中,对于 Npgsql,它最初会加载每个模式的每个表——即使搜索路径中列出了特定模式,但随后(为什么?)它在生成之前将表计数清零表格。
有人可以帮忙吗?
Npgsql 是从 Nuget 安装的,PetaPoco 也是如此。
作为参考,在重新创建和重命名架构之前一切都很好。
app.config
是:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
</startup>
<system.data>
<DbProviderFactories>
<remove invariant="Npgsql" />
<add name="Npgsql Data Provider" invariant="Npgsql" support="FF"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<clear/>
<add name="localconnection" providerName="Npgsql"
connectionString="Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;Password=password;Searchpath=nova"/>
</connectionStrings>
Database.tt
设置为:
// Settings
ConnectionStringName = "localconnection"; // Uses last connection string in config if not specified
Namespace = "chaos";
RepoName = "chaosDB";
GenerateOperations = true;
GeneratePocos = true;
GenerateCommon = true;
ClassPrefix = "";
ClassSuffix = "";
TrackModifiedColumns = false;
ExplicitColumns = true;
ExcludePrefix = new string[] ; // Exclude tables by prefix.
【问题讨论】:
【参考方案1】:这是可行的,但指出 LoadTables() 存在一些固有问题,因为当 PostgreSQL 数据库具有多个模式时,它适用于 Npgsql——我猜某处存在名称冲突..
我回到我的 PostgreSQL 数据库并删除了所有模式,除了我需要的模式。现在正确运行 Database.tt 模板并快速生成 POCO 且没有错误。
此外,以前版本的 PetaPoco 在多模式方面没有问题——它的最新版本似乎有困难。
【讨论】:
以上是关于PetaPoco POCO 生成失败,序列包含多个匹配元素的主要内容,如果未能解决你的问题,请参考以下文章