Linq2db: "Column is null" exception in t4 template generation

Created on 23 Nov 2018  ·  4Comments  ·  Source: linq2db/linq2db

Getting exception while trying to generate code for PostreSQL table.

Exception message: "Column is null"
Stack trace:
   в Npgsql.BackendMessages.DataRowMessage.CheckNotNull()
   в Npgsql.NpgsqlDataReader.<ReadColumn>d__102`1.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Threading.Tasks.ValueTask`1.get_Result()
   в Npgsql.NpgsqlDataReader.ReadColumn[T](Int32 ordinal)
   в Npgsql.NpgsqlDataReader.GetString(Int32 ordinal)
   в LinqToDB.DataProvider.PostgreSQL.PostgreSQLSchemaProvider.<>c.<GetProcedures>b__10_1(IDataReader rd)
   в LinqToDB.Data.CommandInfo.<ReadEnumerator>d__12`1.MoveNext()
   в System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   в System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   в LinqToDB.DataProvider.PostgreSQL.PostgreSQLSchemaProvider.GetProcedures(DataConnection dataConnection)
   в LinqToDB.SchemaProvider.SchemaProviderBase.GetSchema(DataConnection dataConnection, GetSchemaOptions options)
   в Microsoft.VisualStudio.TextTemplating8443204E240B8147B056110E0E4BC8AB81D321E389036B8A152EFDB7AB6DE831DE8792DA917C4E6F4CF8354E3D567A8FA628BAB978B7BE436622553B7B1613A2.GeneratedTextTransformation.LoadServerMetadata(DataConnection dataConnection) в C:\Users\shdp\.nuget\packages\linq2db.postgresql\2.5.4\build\..\contentFiles\any\any\LinqToDB.Templates\DataModel.ttinclude:строка 103
   в Microsoft.VisualStudio.TextTemplating8443204E240B8147B056110E0E4BC8AB81D321E389036B8A152EFDB7AB6DE831DE8792DA917C4E6F4CF8354E3D567A8FA628BAB978B7BE436622553B7B1613A2.GeneratedTextTransformation.LoadMetadata(DataConnection dataConnection) в C:\Users\shdp\.nuget\packages\linq2db.postgresql\2.5.4\build\..\contentFiles\any\any\LinqToDB.Templates\DataModel.ttinclude:строка 414
   в Microsoft.VisualStudio.TextTemplating8443204E240B8147B056110E0E4BC8AB81D321E389036B8A152EFDB7AB6DE831DE8792DA917C4E6F4CF8354E3D567A8FA628BAB978B7BE436622553B7B1613A2.GeneratedTextTransformation.LoadPostgreSQLMetadata(String server, String port, String database, String uid, String password) в C:\Users\shdp\.nuget\packages\linq2db.postgresql\2.5.4\build\..\contentFiles\any\any\LinqToDB.Templates\LinqToDB.PostgreSQL.ttinclude:строка 141
   в Microsoft.VisualStudio.TextTemplating8443204E240B8147B056110E0E4BC8AB81D321E389036B8A152EFDB7AB6DE831DE8792DA917C4E6F4CF8354E3D567A8FA628BAB978B7BE436622553B7B1613A2.GeneratedTextTransformation.TransformText() в C:\tfs\git\IntegrationApi\IntegrationApi\Data\Identity.tt:строка 9

Steps to reproduce

I've installed postres 11 on dev machine with default settings.
Added one table in database.
SQL script for table:

CREATE TABLE public.grants
(
    key character varying COLLATE pg_catalog."default" NOT NULL,
    type character varying COLLATE pg_catalog."default",
    subject_id character varying COLLATE pg_catalog."default",
    client_id character varying COLLATE pg_catalog."default",
    creation_time timestamp without time zone,
    expiration timestamp without time zone,
    data character varying COLLATE pg_catalog."default",
    CONSTRAINT grants_pkey PRIMARY KEY (key)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.grants
    OWNER to postgres;

Created new ASP .Net Core 2.1 application.
Added reference to linq2db, linq2db.PostgreSQL, linq2db.t4models.
Added new Identity.tt file in project with this code:

<#@ template language="C#" debug="True" hostSpecific="True"                            #>
<#@ output extension=".generated.cs"                                                   #>
<#@ include file="$(LinqToDBT4PostgreSQLTemplatesDirectory)LinqToDB.PostgreSQL.Tools.ttinclude" #>
<#@ include file="$(LinqToDBT4PostgreSQLTemplatesDirectory)PluralizationService.ttinclude"      #>
<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.PostgreSQL.Tools.ttinclude" #>
<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"      #>
<#
    NamespaceName = "Data.Identity";
    LoadPostgreSQLMetadata("localhost", "5432", "postgres", "postgres", "postgres");
    GenerateConstructors = false;
    GenerateModel();
#>

Saved, got an exception.

Environment details

linq2db version: 2.5.4 (all packages)
Database Server: PostgreSQL 11.1
Database Provider: Npgsql 3.2.5
Operating system: Windows 10 Pro
Framework version: .NET Core 2.1

T4 has-pr bug

Most helpful comment

@shnipov, looks like there is something that we have not handled with postgres,
If stored procs are not relevant for you can disable them before loading data model.

GetSchemaOptions.GetProcedures = false;

We will fix that in upcoming release.

All 4 comments

@shnipov, looks like there is something that we have not handled with postgres,
If stored procs are not relevant for you can disable them before loading data model.

GetSchemaOptions.GetProcedures = false;

We will fix that in upcoming release.

@MaceWindu, can we do something here in general way that will not break model generation? Maybe generate some warning in compilable generated code.

@sdanyliv, i don't need stored procedures now, with GetProcedures = false it works perfect.
Thanks for quick reply.

Reproduced with pgsql 11 (other versions work), fix will be in next release

Was this page helpful?
0 / 5 - 0 ratings