The generated code is inconsistance.
Class model is correct
ApplicationDbContext is incorrect (does not match diagram, mapping is incorrect)
SQL code is incorrect (does not match diagram)
Entity Developer files: https://filebin.net/eejz1tnik5a74u5e
Below is the generated code where all prosperities (except for primary key) is set to nullable
https://pasteboard.co/JTXkJl8.png
The root cause of this issue (the efml information are saved incorrectly)
p1:nullable="True" <-- this is right
not-null="True" <-- this is wrong it should be saved as "not-null="False" because the column is set to nullable.
Code: Select all
<property name="MetaData" type="String" p1:nullable="True" p1:ValidateRequired="false" p1:Guid="6a3e0473-d959-4044-ac85-dce9ad4a18d4">
<column name="meta_data" not-null="True" sql-type="varchar" p1:unicode="True" />
Code: Select all
modelBuilder.Entity<Card>().Property(x => x.MetaData).HasColumnName(@"meta_data").HasColumnType(@"varchar").IsRequired().ValueGeneratedNever();
Generated code - incorrect code generated (does not match model diagram)
Test.ApplicationDbContext.cs
Code: Select all
//------------------------------------------------------------------------------
// This is auto-generated code.
//------------------------------------------------------------------------------
// This code was generated by Entity Developer tool using EF Core template.
// Code is generated on: 24/03/2021 1:32:48 AM
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.EntityFrameworkCore.Metadata;
using Test.DataModels;
namespace Test.Infrastructure.Data
{
public partial class ApplicationDbContext : DbContext
{
public ApplicationDbContext() :
base()
{
OnCreated();
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) :
base(options)
{
OnCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured ||
(!optionsBuilder.Options.Extensions.OfType<RelationalOptionsExtension>().Any(ext => !string.IsNullOrEmpty(ext.ConnectionString) || ext.Connection != null) &&
!optionsBuilder.Options.Extensions.Any(ext => !(ext is RelationalOptionsExtension) && !(ext is CoreOptionsExtension))))
{
}
CustomizeConfiguration(ref optionsBuilder);
base.OnConfiguring(optionsBuilder);
}
partial void CustomizeConfiguration(ref DbContextOptionsBuilder optionsBuilder);
public virtual DbSet<Card> Cards
{
get;
set;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
this.CardMapping(modelBuilder);
this.CustomizeCardMapping(modelBuilder);
RelationshipsMapping(modelBuilder);
CustomizeMapping(ref modelBuilder);
}
#region Card Mapping
private void CardMapping(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Card>().ToTable(@"card", @"public");
modelBuilder.Entity<Card>().Property(x => x.Id).HasColumnName(@"id").HasColumnType(@"uuid").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.Nickname).HasColumnName(@"nickname").HasColumnType(@"varchar").ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.FirstName).HasColumnName(@"first_name").HasColumnType(@"varchar").ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.LastName).HasColumnName(@"last_name").HasColumnType(@"varchar").ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.Name).HasColumnName(@"`name`").HasColumnType(@"varchar").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.Number).HasColumnName(@"`number`").HasColumnType(@"varchar").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.ExpirationMonth).HasColumnName(@"expiration_month").HasColumnType(@"int4").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.ExpirationYear).HasColumnName(@"expiration_year").HasColumnType(@"int4").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.BillingAddressLine1).HasColumnName(@"billing_address_line1").HasColumnType(@"varchar").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.BillingAddressLine2).HasColumnName(@"billing_address_line2").HasColumnType(@"varchar").ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.BillingCountryState).HasColumnName(@"billing_country_state").HasColumnType(@"varchar").ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.BillingTownCity).HasColumnName(@"billing_town_city").HasColumnType(@"varchar").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.BillingPostalCode).HasColumnName(@"billing_postal_code").HasColumnType(@"varchar").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.BillingCountry).HasColumnName(@"billing_country").HasColumnType(@"varchar").ValueGeneratedNever();
modelBuilder.Entity<Card>().Property(x => x.MetaData).HasColumnName(@"meta_data").HasColumnType(@"varchar").IsRequired().ValueGeneratedNever();
modelBuilder.Entity<Card>().HasKey(@"Id");
}
partial void CustomizeCardMapping(ModelBuilder modelBuilder);
#endregion
private void RelationshipsMapping(ModelBuilder modelBuilder)
{
}
partial void CustomizeMapping(ref ModelBuilder modelBuilder);
public bool HasChanges()
{
return ChangeTracker.Entries().Any(e => e.State == Microsoft.EntityFrameworkCore.EntityState.Added || e.State == Microsoft.EntityFrameworkCore.EntityState.Modified || e.State == Microsoft.EntityFrameworkCore.EntityState.Deleted);
}
partial void OnCreated();
}
}
Code: Select all
//------------------------------------------------------------------------------
// This is auto-generated code.
//------------------------------------------------------------------------------
// This code was generated by Entity Developer tool using EF Core template.
// Code is generated on: 24/03/2021 1:32:48 AM
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
namespace Test.DataModels
{
public partial class Card {
public Card()
{
OnCreated();
}
[Key]
[Required()]
public virtual Guid Id { get; set; }
public virtual string Nickname { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Name { get; set; }
public virtual string Number { get; set; }
public virtual int? ExpirationMonth { get; set; }
public virtual int? ExpirationYear { get; set; }
public virtual string BillingAddressLine1 { get; set; }
public virtual string BillingAddressLine2 { get; set; }
public virtual string BillingCountryState { get; set; }
public virtual string BillingTownCity { get; set; }
public virtual string BillingPostalCode { get; set; }
public virtual string BillingCountry { get; set; }
public virtual string MetaData { get; set; }
#region Extensibility Method Definitions
partial void OnCreated();
#endregion
}
}
Code: Select all
-- Script was generated by Devart Entity Developer, Version 6.10.1189.0
-- Script date 24/03/2021 2:01:56 AM
-- Target Server: PostgreSQL
-- Server Version: 13.0
--
-- Creating a table public.card
--
CREATE TABLE public.card (
id UUID NOT NULL,
nickname VARCHAR,
first_name VARCHAR,
last_name VARCHAR,
"name" VARCHAR NOT NULL,
"number" VARCHAR NOT NULL,
expiration_month INT4 NOT NULL,
expiration_year INT4 NOT NULL,
billing_address_line1 VARCHAR NOT NULL,
billing_address_line2 VARCHAR,
billing_country_state VARCHAR,
billing_town_city VARCHAR NOT NULL,
billing_postal_code VARCHAR NOT NULL,
billing_country VARCHAR,
meta_data VARCHAR NOT NULL,
CONSTRAINT "PK_card" PRIMARY KEY (id)
);