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 生成失败,序列包含多个匹配元素的主要内容,如果未能解决你的问题,请参考以下文章

Peta Poco:如何将多个参数传递给 Fetch<T>

petapoco IsNew

PetaPoco 插入 - 最快的方法?

PetaPoco 笔记

PetaPoco源代码学习--1.使用的Attribute介绍

PetaPoco的T4模板报错的问题