primera version estable
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
<Solution>
|
<Solution>
|
||||||
<Project Path="bdEmtusa/bdEmtusa.csproj" />
|
<Project Path="bdEmtusa/bdEmtusa.csproj" />
|
||||||
|
<Project Path="swEmtusa/swEmtusa.csproj" />
|
||||||
</Solution>
|
</Solution>
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
namespace bdEmtusa
|
|
||||||
{
|
|
||||||
public class Class1
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
360
bdEmtusa/CodeTemplates/EFCore/DbContext.t4
Normal file
360
bdEmtusa/CodeTemplates/EFCore/DbContext.t4
Normal file
@@ -0,0 +1,360 @@
|
|||||||
|
<#@ template hostSpecific="true" #>
|
||||||
|
<#@ assembly name="Microsoft.EntityFrameworkCore" #>
|
||||||
|
<#@ assembly name="Microsoft.EntityFrameworkCore.Design" #>
|
||||||
|
<#@ assembly name="Microsoft.EntityFrameworkCore.Relational" #>
|
||||||
|
<#@ assembly name="Microsoft.Extensions.DependencyInjection.Abstractions" #>
|
||||||
|
<#@ parameter name="Model" type="Microsoft.EntityFrameworkCore.Metadata.IModel" #>
|
||||||
|
<#@ parameter name="Options" type="Microsoft.EntityFrameworkCore.Scaffolding.ModelCodeGenerationOptions" #>
|
||||||
|
<#@ parameter name="NamespaceHint" type="System.String" #>
|
||||||
|
<#@ import namespace="System.Collections.Generic" #>
|
||||||
|
<#@ import namespace="System.Linq" #>
|
||||||
|
<#@ import namespace="System.Text" #>
|
||||||
|
<#@ import namespace="Microsoft.EntityFrameworkCore" #>
|
||||||
|
<#@ import namespace="Microsoft.EntityFrameworkCore.Design" #>
|
||||||
|
<#@ import namespace="Microsoft.EntityFrameworkCore.Infrastructure" #>
|
||||||
|
<#@ import namespace="Microsoft.EntityFrameworkCore.Scaffolding" #>
|
||||||
|
<#@ import namespace="Microsoft.Extensions.DependencyInjection" #>
|
||||||
|
<#
|
||||||
|
// Template version: 800 - please do NOT remove this line
|
||||||
|
if (!ProductInfo.GetVersion().StartsWith("8.0"))
|
||||||
|
{
|
||||||
|
Warning("Your templates were created using an older version of Entity Framework. Additional features and bug fixes may be available. See https://aka.ms/efcore-docs-updating-templates for more information.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var services = (IServiceProvider)Host;
|
||||||
|
var providerCode = services.GetRequiredService<IProviderConfigurationCodeGenerator>();
|
||||||
|
var annotationCodeGenerator = services.GetRequiredService<IAnnotationCodeGenerator>();
|
||||||
|
var code = services.GetRequiredService<ICSharpHelper>();
|
||||||
|
|
||||||
|
var usings = new List<string>
|
||||||
|
{
|
||||||
|
"System",
|
||||||
|
"System.Collections.Generic",
|
||||||
|
"Microsoft.EntityFrameworkCore"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (NamespaceHint != Options.ModelNamespace
|
||||||
|
&& !string.IsNullOrEmpty(Options.ModelNamespace))
|
||||||
|
{
|
||||||
|
usings.Add(Options.ModelNamespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(NamespaceHint))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
namespace <#= NamespaceHint #>;
|
||||||
|
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
public partial class <#= Options.ContextName #> : DbContext
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
if (!Options.SuppressOnConfiguring)
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
public <#= Options.ContextName #>()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
public <#= Options.ContextName #>(DbContextOptions<<#= Options.ContextName #>> options)
|
||||||
|
: base(options)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
foreach (var entityType in Model.GetEntityTypes().Where(e => !e.IsSimpleManyToManyJoinEntityType()))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
public virtual DbSet<<#= entityType.Name #>> <#= entityType.GetDbSetName() #> { get; set; }
|
||||||
|
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Options.SuppressOnConfiguring)
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
|
<#
|
||||||
|
if (!Options.SuppressConnectionStringWarning)
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
=> optionsBuilder<#= code.Fragment(providerCode.GenerateUseProvider(Options.ConnectionString), indent: 3) #>;
|
||||||
|
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
#>
|
||||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
var anyConfiguration = false;
|
||||||
|
|
||||||
|
var modelFluentApiCalls = Model.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
if (modelFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(modelFluentApiCalls.GetRequiredUsings());
|
||||||
|
#>
|
||||||
|
modelBuilder<#= code.Fragment(modelFluentApiCalls, indent: 3) #>;
|
||||||
|
<#
|
||||||
|
anyConfiguration = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder mainEnvironment;
|
||||||
|
foreach (var entityType in Model.GetEntityTypes().Where(e => !e.IsSimpleManyToManyJoinEntityType()))
|
||||||
|
{
|
||||||
|
// Save all previously generated code, and start generating into a new temporary environment
|
||||||
|
mainEnvironment = GenerationEnvironment;
|
||||||
|
GenerationEnvironment = new StringBuilder();
|
||||||
|
|
||||||
|
if (anyConfiguration)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
|
||||||
|
var anyEntityTypeConfiguration = false;
|
||||||
|
#>
|
||||||
|
modelBuilder.Entity<<#= entityType.Name #>>(entity =>
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
var key = entityType.FindPrimaryKey();
|
||||||
|
if (key != null)
|
||||||
|
{
|
||||||
|
var keyFluentApiCalls = key.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
if (keyFluentApiCalls != null
|
||||||
|
|| (!key.IsHandledByConvention() && !Options.UseDataAnnotations))
|
||||||
|
{
|
||||||
|
if (keyFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(keyFluentApiCalls.GetRequiredUsings());
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
entity.HasKey(<#= code.Lambda(key.Properties, "e") #>)<#= code.Fragment(keyFluentApiCalls, indent: 4) #>;
|
||||||
|
<#
|
||||||
|
anyEntityTypeConfiguration = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var entityTypeFluentApiCalls = entityType.GetFluentApiCalls(annotationCodeGenerator)
|
||||||
|
?.FilterChain(c => !(Options.UseDataAnnotations && c.IsHandledByDataAnnotations));
|
||||||
|
if (entityTypeFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(entityTypeFluentApiCalls.GetRequiredUsings());
|
||||||
|
|
||||||
|
if (anyEntityTypeConfiguration)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
entity<#= code.Fragment(entityTypeFluentApiCalls, indent: 4) #>;
|
||||||
|
<#
|
||||||
|
anyEntityTypeConfiguration = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var index in entityType.GetIndexes()
|
||||||
|
.Where(i => !(Options.UseDataAnnotations && i.IsHandledByDataAnnotations(annotationCodeGenerator))))
|
||||||
|
{
|
||||||
|
if (anyEntityTypeConfiguration)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
|
||||||
|
var indexFluentApiCalls = index.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
if (indexFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(indexFluentApiCalls.GetRequiredUsings());
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
entity.HasIndex(<#= code.Lambda(index.Properties, "e") #>, <#= code.Literal(index.GetDatabaseName()) #>)<#= code.Fragment(indexFluentApiCalls, indent: 4) #>;
|
||||||
|
<#
|
||||||
|
anyEntityTypeConfiguration = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var firstProperty = true;
|
||||||
|
foreach (var property in entityType.GetProperties())
|
||||||
|
{
|
||||||
|
var propertyFluentApiCalls = property.GetFluentApiCalls(annotationCodeGenerator)
|
||||||
|
?.FilterChain(c => !(Options.UseDataAnnotations && c.IsHandledByDataAnnotations)
|
||||||
|
&& !(c.Method == "IsRequired" && Options.UseNullableReferenceTypes && !property.ClrType.IsValueType));
|
||||||
|
if (propertyFluentApiCalls == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
usings.AddRange(propertyFluentApiCalls.GetRequiredUsings());
|
||||||
|
|
||||||
|
if (anyEntityTypeConfiguration && firstProperty)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
entity.Property(e => e.<#= property.Name #>)<#= code.Fragment(propertyFluentApiCalls, indent: 4) #>;
|
||||||
|
<#
|
||||||
|
anyEntityTypeConfiguration = true;
|
||||||
|
firstProperty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var foreignKey in entityType.GetForeignKeys())
|
||||||
|
{
|
||||||
|
var foreignKeyFluentApiCalls = foreignKey.GetFluentApiCalls(annotationCodeGenerator)
|
||||||
|
?.FilterChain(c => !(Options.UseDataAnnotations && c.IsHandledByDataAnnotations));
|
||||||
|
if (foreignKeyFluentApiCalls == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
usings.AddRange(foreignKeyFluentApiCalls.GetRequiredUsings());
|
||||||
|
|
||||||
|
if (anyEntityTypeConfiguration)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
entity.HasOne(d => d.<#= foreignKey.DependentToPrincipal.Name #>).<#= foreignKey.IsUnique ? "WithOne" : "WithMany" #>(<#= foreignKey.PrincipalToDependent != null ? $"p => p.{foreignKey.PrincipalToDependent.Name}" : "" #>)<#= code.Fragment(foreignKeyFluentApiCalls, indent: 4) #>;
|
||||||
|
<#
|
||||||
|
anyEntityTypeConfiguration = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var skipNavigation in entityType.GetSkipNavigations().Where(n => n.IsLeftNavigation()))
|
||||||
|
{
|
||||||
|
if (anyEntityTypeConfiguration)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
|
||||||
|
var left = skipNavigation.ForeignKey;
|
||||||
|
var leftFluentApiCalls = left.GetFluentApiCalls(annotationCodeGenerator, useStrings: true);
|
||||||
|
var right = skipNavigation.Inverse.ForeignKey;
|
||||||
|
var rightFluentApiCalls = right.GetFluentApiCalls(annotationCodeGenerator, useStrings: true);
|
||||||
|
var joinEntityType = skipNavigation.JoinEntityType;
|
||||||
|
|
||||||
|
if (leftFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(leftFluentApiCalls.GetRequiredUsings());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rightFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(rightFluentApiCalls.GetRequiredUsings());
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
entity.HasMany(d => d.<#= skipNavigation.Name #>).WithMany(p => p.<#= skipNavigation.Inverse.Name #>)
|
||||||
|
.UsingEntity<Dictionary<string, object>>(
|
||||||
|
<#= code.Literal(joinEntityType.Name) #>,
|
||||||
|
r => r.HasOne<<#= right.PrincipalEntityType.Name #>>().WithMany()<#= code.Fragment(rightFluentApiCalls, indent: 6) #>,
|
||||||
|
l => l.HasOne<<#= left.PrincipalEntityType.Name #>>().WithMany()<#= code.Fragment(leftFluentApiCalls, indent: 6) #>,
|
||||||
|
j =>
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
var joinKey = joinEntityType.FindPrimaryKey();
|
||||||
|
var joinKeyFluentApiCalls = joinKey.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
|
||||||
|
if (joinKeyFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(joinKeyFluentApiCalls.GetRequiredUsings());
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
j.HasKey(<#= code.Arguments(joinKey.Properties.Select(e => e.Name)) #>)<#= code.Fragment(joinKeyFluentApiCalls, indent: 7) #>;
|
||||||
|
<#
|
||||||
|
var joinEntityTypeFluentApiCalls = joinEntityType.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
if (joinEntityTypeFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(joinEntityTypeFluentApiCalls.GetRequiredUsings());
|
||||||
|
#>
|
||||||
|
j<#= code.Fragment(joinEntityTypeFluentApiCalls, indent: 7) #>;
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var index in joinEntityType.GetIndexes())
|
||||||
|
{
|
||||||
|
var indexFluentApiCalls = index.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
if (indexFluentApiCalls != null)
|
||||||
|
{
|
||||||
|
usings.AddRange(indexFluentApiCalls.GetRequiredUsings());
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
j.HasIndex(<#= code.Literal(index.Properties.Select(e => e.Name).ToArray()) #>, <#= code.Literal(index.GetDatabaseName()) #>)<#= code.Fragment(indexFluentApiCalls, indent: 7) #>;
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var property in joinEntityType.GetProperties())
|
||||||
|
{
|
||||||
|
var propertyFluentApiCalls = property.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
if (propertyFluentApiCalls == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
usings.AddRange(propertyFluentApiCalls.GetRequiredUsings());
|
||||||
|
#>
|
||||||
|
j.IndexerProperty<<#= code.Reference(property.ClrType) #>>(<#= code.Literal(property.Name) #>)<#= code.Fragment(propertyFluentApiCalls, indent: 7) #>;
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
});
|
||||||
|
<#
|
||||||
|
anyEntityTypeConfiguration = true;
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
});
|
||||||
|
<#
|
||||||
|
// If any signicant code was generated, append it to the main environment
|
||||||
|
if (anyEntityTypeConfiguration)
|
||||||
|
{
|
||||||
|
mainEnvironment.Append(GenerationEnvironment);
|
||||||
|
anyConfiguration = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resume generating code into the main environment
|
||||||
|
GenerationEnvironment = mainEnvironment;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var sequence in Model.GetSequences())
|
||||||
|
{
|
||||||
|
var needsType = sequence.Type != typeof(long);
|
||||||
|
var needsSchema = !string.IsNullOrEmpty(sequence.Schema) && sequence.Schema != sequence.Model.GetDefaultSchema();
|
||||||
|
var sequenceFluentApiCalls = sequence.GetFluentApiCalls(annotationCodeGenerator);
|
||||||
|
#>
|
||||||
|
modelBuilder.HasSequence<#= needsType ? $"<{code.Reference(sequence.Type)}>" : "" #>(<#= code.Literal(sequence.Name) #><#= needsSchema ? $", {code.Literal(sequence.Schema)}" : "" #>)<#= code.Fragment(sequenceFluentApiCalls, indent: 3) #>;
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anyConfiguration)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
OnModelCreatingPartial(modelBuilder);
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
|
||||||
|
}
|
||||||
|
<#
|
||||||
|
mainEnvironment = GenerationEnvironment;
|
||||||
|
GenerationEnvironment = new StringBuilder();
|
||||||
|
|
||||||
|
WriteLine("// <auto-generated> This file has been auto generated by EF Core Power Tools. </autogenerated>");
|
||||||
|
if (Options.UseNullableReferenceTypes)
|
||||||
|
{
|
||||||
|
WriteLine("#nullable enable");
|
||||||
|
}
|
||||||
|
WriteLine("");
|
||||||
|
|
||||||
|
foreach (var ns in usings.Distinct().OrderBy(x => x, new NamespaceComparer()))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
using <#= ns #>;
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteLine("");
|
||||||
|
|
||||||
|
GenerationEnvironment.Append(mainEnvironment);
|
||||||
|
#>
|
||||||
181
bdEmtusa/CodeTemplates/EFCore/EntityType.t4
Normal file
181
bdEmtusa/CodeTemplates/EFCore/EntityType.t4
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
<#@ template hostSpecific="true" #>
|
||||||
|
<#@ assembly name="Microsoft.EntityFrameworkCore" #>
|
||||||
|
<#@ assembly name="Microsoft.EntityFrameworkCore.Design" #>
|
||||||
|
<#@ assembly name="Microsoft.EntityFrameworkCore.Relational" #>
|
||||||
|
<#@ assembly name="Microsoft.Extensions.DependencyInjection.Abstractions" #>
|
||||||
|
<#@ parameter name="EntityType" type="Microsoft.EntityFrameworkCore.Metadata.IEntityType" #>
|
||||||
|
<#@ parameter name="Options" type="Microsoft.EntityFrameworkCore.Scaffolding.ModelCodeGenerationOptions" #>
|
||||||
|
<#@ parameter name="NamespaceHint" type="System.String" #>
|
||||||
|
<#@ import namespace="System.Collections.Generic" #>
|
||||||
|
<#@ import namespace="System.ComponentModel.DataAnnotations" #>
|
||||||
|
<#@ import namespace="System.Linq" #>
|
||||||
|
<#@ import namespace="System.Text" #>
|
||||||
|
<#@ import namespace="Microsoft.EntityFrameworkCore" #>
|
||||||
|
<#@ import namespace="Microsoft.EntityFrameworkCore.Design" #>
|
||||||
|
<#@ import namespace="Microsoft.Extensions.DependencyInjection" #>
|
||||||
|
<#
|
||||||
|
// Template version: 800 - please do NOT remove this line
|
||||||
|
if (EntityType.IsSimpleManyToManyJoinEntityType())
|
||||||
|
{
|
||||||
|
// Don't scaffold these
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
var services = (IServiceProvider)Host;
|
||||||
|
var annotationCodeGenerator = services.GetRequiredService<IAnnotationCodeGenerator>();
|
||||||
|
var code = services.GetRequiredService<ICSharpHelper>();
|
||||||
|
|
||||||
|
var usings = new List<string>
|
||||||
|
{
|
||||||
|
"System",
|
||||||
|
"System.Collections.Generic"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Options.UseDataAnnotations)
|
||||||
|
{
|
||||||
|
usings.Add("System.ComponentModel.DataAnnotations");
|
||||||
|
usings.Add("System.ComponentModel.DataAnnotations.Schema");
|
||||||
|
usings.Add("Microsoft.EntityFrameworkCore");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(NamespaceHint))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
namespace <#= NamespaceHint #>;
|
||||||
|
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(EntityType.GetComment()))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
/// <summary>
|
||||||
|
/// <#= code.XmlComment(EntityType.GetComment()) #>
|
||||||
|
/// </summary>
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Options.UseDataAnnotations)
|
||||||
|
{
|
||||||
|
foreach (var dataAnnotation in EntityType.GetDataAnnotations(annotationCodeGenerator))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
<#= code.Fragment(dataAnnotation) #>
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
public partial class <#= EntityType.Name #>
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
var firstProperty = true;
|
||||||
|
foreach (var property in EntityType.GetProperties().OrderBy(p => p.GetColumnOrder() ?? -1))
|
||||||
|
{
|
||||||
|
if (!firstProperty)
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(property.GetComment()))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
/// <summary>
|
||||||
|
/// <#= code.XmlComment(property.GetComment(), indent: 1) #>
|
||||||
|
/// </summary>
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Options.UseDataAnnotations)
|
||||||
|
{
|
||||||
|
var dataAnnotations = property.GetDataAnnotations(annotationCodeGenerator)
|
||||||
|
.Where(a => !(a.Type == typeof(RequiredAttribute) && Options.UseNullableReferenceTypes && !property.ClrType.IsValueType));
|
||||||
|
foreach (var dataAnnotation in dataAnnotations)
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
<#= code.Fragment(dataAnnotation) #>
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
usings.AddRange(code.GetRequiredUsings(property.ClrType));
|
||||||
|
|
||||||
|
var needsNullable = Options.UseNullableReferenceTypes && property.IsNullable && !property.ClrType.IsValueType;
|
||||||
|
var needsInitializer = Options.UseNullableReferenceTypes && !property.IsNullable && !property.ClrType.IsValueType;
|
||||||
|
#>
|
||||||
|
public <#= code.Reference(property.ClrType) #><#= needsNullable ? "?" : "" #> <#= property.Name #> { get; set; }<#= needsInitializer ? " = null!;" : "" #>
|
||||||
|
<#
|
||||||
|
firstProperty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var navigation in EntityType.GetNavigations())
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
|
||||||
|
if (Options.UseDataAnnotations)
|
||||||
|
{
|
||||||
|
foreach (var dataAnnotation in navigation.GetDataAnnotations(annotationCodeGenerator))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
<#= code.Fragment(dataAnnotation) #>
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetType = navigation.TargetEntityType.Name;
|
||||||
|
if (navigation.IsCollection)
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
public virtual ICollection<<#= targetType #>> <#= navigation.Name #> { get; set; } = new List<<#= targetType #>>();
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var needsNullable = Options.UseNullableReferenceTypes && !(navigation.ForeignKey.IsRequired && navigation.IsOnDependent);
|
||||||
|
var needsInitializer = Options.UseNullableReferenceTypes && navigation.ForeignKey.IsRequired && navigation.IsOnDependent;
|
||||||
|
#>
|
||||||
|
public virtual <#= targetType #><#= needsNullable ? "?" : "" #> <#= navigation.Name #> { get; set; }<#= needsInitializer ? " = null!;" : "" #>
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var skipNavigation in EntityType.GetSkipNavigations())
|
||||||
|
{
|
||||||
|
WriteLine("");
|
||||||
|
|
||||||
|
if (Options.UseDataAnnotations)
|
||||||
|
{
|
||||||
|
foreach (var dataAnnotation in skipNavigation.GetDataAnnotations(annotationCodeGenerator))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
<#= code.Fragment(dataAnnotation) #>
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
public virtual ICollection<<#= skipNavigation.TargetEntityType.Name #>> <#= skipNavigation.Name #> { get; set; } = new List<<#= skipNavigation.TargetEntityType.Name #>>();
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
}
|
||||||
|
<#
|
||||||
|
var previousOutput = GenerationEnvironment;
|
||||||
|
GenerationEnvironment = new StringBuilder();
|
||||||
|
|
||||||
|
WriteLine("// <auto-generated> This file has been auto generated by EF Core Power Tools. </autogenerated>");
|
||||||
|
if (Options.UseNullableReferenceTypes)
|
||||||
|
{
|
||||||
|
WriteLine("#nullable enable");
|
||||||
|
}
|
||||||
|
WriteLine("");
|
||||||
|
|
||||||
|
foreach (var ns in usings.Distinct().OrderBy(x => x, new NamespaceComparer()))
|
||||||
|
{
|
||||||
|
#>
|
||||||
|
using <#= ns #>;
|
||||||
|
<#
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteLine("");
|
||||||
|
|
||||||
|
GenerationEnvironment.Append(previousOutput);
|
||||||
|
#>
|
||||||
3
bdEmtusa/FodyWeavers.xml
Normal file
3
bdEmtusa/FodyWeavers.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
|
||||||
|
<PropertyChanged />
|
||||||
|
</Weavers>
|
||||||
59
bdEmtusa/Utilidades.cs
Normal file
59
bdEmtusa/Utilidades.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
using bdEmtusa.db;
|
||||||
|
using bdEmtusa.dbcontext;
|
||||||
|
using Microsoft.VisualBasic;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
namespace bdEmtusa
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public class Utilidades
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public static string? VersionPrograma { get; set; }
|
||||||
|
// public static double PorcentajeIva { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public static void GeneraNotificacion(tsUtilidades.TsNotificacionesClient.TipoNotificacionEnum Tipo, string Titulo, string? Cuerpo=null, Exception? ex=null, byte[]? FicheroImagen = null, [CallerMemberName] string? Caller = null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string sMensaje = ((VersionPrograma != null ? "Versión Programa: " + VersionPrograma : "")
|
||||||
|
+ (Caller != null ? " Rutina: " + Caller : "")
|
||||||
|
+ (Cuerpo != null ? Cuerpo : Titulo)
|
||||||
|
).Trim();
|
||||||
|
if (ex != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
string sStackTrace = "Tipo excepción: " + ex.ToString() + Constants.vbCrLf;
|
||||||
|
var exError = ex;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
sStackTrace += exError.StackTrace + Constants.vbCrLf;
|
||||||
|
exError = exError.InnerException;
|
||||||
|
}
|
||||||
|
while (exError != null);
|
||||||
|
if (!string.IsNullOrEmpty(sStackTrace))
|
||||||
|
sMensaje += Constants.vbCrLf + "StackTrace: " + sStackTrace;
|
||||||
|
}
|
||||||
|
if (FicheroImagen is null)
|
||||||
|
{
|
||||||
|
tsUtilidades.TsNotificacionesClient.RegistrarAsync(Titulo, sMensaje, Tipo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tsUtilidades.TsNotificacionesClient.RegistrarAsync(Titulo, sMensaje, Tipo, FicheroImagen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex2)
|
||||||
|
{
|
||||||
|
throw new Exception(ex2.Message, ex2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,4 +6,16 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="8.0.30" />
|
||||||
|
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0" />
|
||||||
|
<PackageReference Include="PropertyChanged.Fody" Version="4.1.0" />
|
||||||
|
<PackageReference Include="tsEFCore8" Version="1.0.6" />
|
||||||
|
<PackageReference Include="tsUtilidades" Version="1.1.23" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="db\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
34
bdEmtusa/db/channels.cs
Normal file
34
bdEmtusa/db/channels.cs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// <auto-generated> This file has been auto generated by EF Core Power Tools. </autogenerated>
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace bdEmtusa.db;
|
||||||
|
|
||||||
|
public partial class channels
|
||||||
|
{
|
||||||
|
public uint id { get; set; }
|
||||||
|
|
||||||
|
public DateTime? creacion { get; set; }
|
||||||
|
|
||||||
|
public DateTime? modificacion { get; set; }
|
||||||
|
|
||||||
|
public uint n_modificaciones { get; set; }
|
||||||
|
|
||||||
|
public string? title { get; set; }
|
||||||
|
|
||||||
|
public string? description { get; set; }
|
||||||
|
|
||||||
|
public string? link { get; set; }
|
||||||
|
|
||||||
|
public DateTime? lastBuildDate { get; set; }
|
||||||
|
|
||||||
|
public string? generator { get; set; }
|
||||||
|
|
||||||
|
public string? language { get; set; }
|
||||||
|
|
||||||
|
public bool oculto { get; set; }
|
||||||
|
|
||||||
|
public virtual ICollection<items> items { get; set; } = new List<items>();
|
||||||
|
}
|
||||||
18
bdEmtusa/db/configuracion.cs
Normal file
18
bdEmtusa/db/configuracion.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// <auto-generated> This file has been auto generated by EF Core Power Tools. </autogenerated>
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace bdEmtusa.db;
|
||||||
|
|
||||||
|
public partial class configuracion
|
||||||
|
{
|
||||||
|
public int id { get; set; }
|
||||||
|
|
||||||
|
public string codigo { get; set; } = null!;
|
||||||
|
|
||||||
|
public string? grupo { get; set; }
|
||||||
|
|
||||||
|
public string? valor { get; set; }
|
||||||
|
}
|
||||||
20
bdEmtusa/db/historico.cs
Normal file
20
bdEmtusa/db/historico.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// <auto-generated> This file has been auto generated by EF Core Power Tools. </autogenerated>
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace bdEmtusa.db;
|
||||||
|
|
||||||
|
public partial class historico
|
||||||
|
{
|
||||||
|
public uint id { get; set; }
|
||||||
|
|
||||||
|
public DateTime? fechaHora { get; set; }
|
||||||
|
|
||||||
|
public uint? id_channel { get; set; }
|
||||||
|
|
||||||
|
public uint? id_item { get; set; }
|
||||||
|
|
||||||
|
public string? descripcion { get; set; }
|
||||||
|
}
|
||||||
38
bdEmtusa/db/items.cs
Normal file
38
bdEmtusa/db/items.cs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
// <auto-generated> This file has been auto generated by EF Core Power Tools. </autogenerated>
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace bdEmtusa.db;
|
||||||
|
|
||||||
|
public partial class items
|
||||||
|
{
|
||||||
|
public uint id { get; set; }
|
||||||
|
|
||||||
|
public uint? id_channel { get; set; }
|
||||||
|
|
||||||
|
public DateTime? creacion { get; set; }
|
||||||
|
|
||||||
|
public DateTime? modificacion { get; set; }
|
||||||
|
|
||||||
|
public uint n_modificaciones { get; set; }
|
||||||
|
|
||||||
|
public string? title { get; set; }
|
||||||
|
|
||||||
|
public string? link { get; set; }
|
||||||
|
|
||||||
|
public string? guid { get; set; }
|
||||||
|
|
||||||
|
public bool? guidIsPermaLink { get; set; }
|
||||||
|
|
||||||
|
public string? description { get; set; }
|
||||||
|
|
||||||
|
public string? category { get; set; }
|
||||||
|
|
||||||
|
public DateTime? pubDate { get; set; }
|
||||||
|
|
||||||
|
public bool oculto { get; set; }
|
||||||
|
|
||||||
|
public virtual channels? id_channelNavigation { get; set; }
|
||||||
|
}
|
||||||
105
bdEmtusa/dbcontext/EmtusaContext.cs
Normal file
105
bdEmtusa/dbcontext/EmtusaContext.cs
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
// <auto-generated> This file has been auto generated by EF Core Power Tools. </autogenerated>
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using bdEmtusa.db;
|
||||||
|
|
||||||
|
namespace bdEmtusa.dbcontext;
|
||||||
|
|
||||||
|
public partial class EmtusaContext : DbContext
|
||||||
|
{
|
||||||
|
public EmtusaContext(DbContextOptions<EmtusaContext> options)
|
||||||
|
: base(options)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual DbSet<channels> channels { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<configuracion> configuracion { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<historico> historico { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<items> items { get; set; }
|
||||||
|
|
||||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
modelBuilder
|
||||||
|
.UseCollation("utf8mb4_0900_ai_ci")
|
||||||
|
.HasCharSet("utf8mb4");
|
||||||
|
|
||||||
|
modelBuilder.Entity<channels>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.id).HasName("PRIMARY");
|
||||||
|
|
||||||
|
entity.Property(e => e.creacion)
|
||||||
|
.HasDefaultValueSql("CURRENT_TIMESTAMP")
|
||||||
|
.HasColumnType("datetime");
|
||||||
|
entity.Property(e => e.description).HasMaxLength(1024);
|
||||||
|
entity.Property(e => e.generator).HasMaxLength(128);
|
||||||
|
entity.Property(e => e.language).HasMaxLength(8);
|
||||||
|
entity.Property(e => e.lastBuildDate).HasColumnType("datetime");
|
||||||
|
entity.Property(e => e.link).HasMaxLength(4096);
|
||||||
|
entity.Property(e => e.modificacion)
|
||||||
|
.ValueGeneratedOnAddOrUpdate()
|
||||||
|
.HasColumnType("datetime");
|
||||||
|
entity.Property(e => e.title).HasMaxLength(128);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<configuracion>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.id).HasName("PRIMARY");
|
||||||
|
|
||||||
|
entity.HasIndex(e => e.codigo, "index_codigo").IsUnique();
|
||||||
|
|
||||||
|
entity.Property(e => e.codigo)
|
||||||
|
.HasMaxLength(128)
|
||||||
|
.HasDefaultValueSql("''");
|
||||||
|
entity.Property(e => e.grupo).HasMaxLength(128);
|
||||||
|
entity.Property(e => e.valor)
|
||||||
|
.HasMaxLength(1024)
|
||||||
|
.HasDefaultValueSql("''");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<historico>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.id).HasName("PRIMARY");
|
||||||
|
|
||||||
|
entity.HasIndex(e => e.id_channel, "historico_fk_id_channel");
|
||||||
|
|
||||||
|
entity.HasIndex(e => e.id_item, "historico_fk_id_item");
|
||||||
|
|
||||||
|
entity.Property(e => e.fechaHora)
|
||||||
|
.HasDefaultValueSql("CURRENT_TIMESTAMP")
|
||||||
|
.HasColumnType("datetime");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<items>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.id).HasName("PRIMARY");
|
||||||
|
|
||||||
|
entity.HasIndex(e => e.id_channel, "FK_id_channel");
|
||||||
|
|
||||||
|
entity.Property(e => e.category).HasMaxLength(64);
|
||||||
|
entity.Property(e => e.creacion)
|
||||||
|
.HasDefaultValueSql("CURRENT_TIMESTAMP")
|
||||||
|
.HasColumnType("datetime");
|
||||||
|
entity.Property(e => e.guid).HasMaxLength(4096);
|
||||||
|
entity.Property(e => e.link).HasMaxLength(4096);
|
||||||
|
entity.Property(e => e.modificacion)
|
||||||
|
.ValueGeneratedOnAddOrUpdate()
|
||||||
|
.HasColumnType("datetime");
|
||||||
|
entity.Property(e => e.pubDate).HasColumnType("datetime");
|
||||||
|
entity.Property(e => e.title).HasMaxLength(1024);
|
||||||
|
|
||||||
|
entity.HasOne(d => d.id_channelNavigation).WithMany(p => p.items)
|
||||||
|
.HasForeignKey(d => d.id_channel)
|
||||||
|
.HasConstraintName("FK_id_channel");
|
||||||
|
});
|
||||||
|
|
||||||
|
OnModelCreatingPartial(modelBuilder);
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
|
||||||
|
}
|
||||||
48
bdEmtusa/dbcontext/conexion.cs
Normal file
48
bdEmtusa/dbcontext/conexion.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
using tsUtilidades.Enumeraciones;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
|
||||||
|
namespace bdEmtusa.dbcontext
|
||||||
|
{
|
||||||
|
public class Conexion
|
||||||
|
{
|
||||||
|
public string Nombre { get; set; }
|
||||||
|
public string Servidor { get; set; }
|
||||||
|
public int Puerto { get; set; }
|
||||||
|
|
||||||
|
public string Database { get; set; }
|
||||||
|
public string Usuario { get; set; }
|
||||||
|
public string Contraseña { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public static List<Conexion> ListaConexiones()
|
||||||
|
{
|
||||||
|
List<Conexion> lc = new List<Conexion>();
|
||||||
|
lc.Add(new Conexion() { Nombre = "Producción", Puerto = 3306, Servidor = "192.168.41.56", Usuario = "root", Contraseña = "0êmF/e#g/*6pZÛLWqölLvPp", Database = "gestionemtusa" });
|
||||||
|
return lc;
|
||||||
|
}
|
||||||
|
internal static string ObtieneConexionDefecto(string NombreConexion="Producción")
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// server=10.10.10.1;database=Emtusa;port=3306;uid=root;pwd=larga;persistsecurityinfo=True;TreatTinyAsBoolean=False;allowuservariables=True
|
||||||
|
string cs = @";persistsecurityinfo=True;TreatTinyAsBoolean=False;allowuservariables=True";
|
||||||
|
var lc = ListaConexiones();
|
||||||
|
|
||||||
|
var cn = lc.First(x => x.Nombre == NombreConexion);
|
||||||
|
cs = "server=" + cn.Servidor + ";pwd=" + tsUtilidades.crypt.FEncS(cn.Contraseña, @"[JO1]", @"[JD1]", -875421649) + ";port=" + cn.Puerto.ToString() + ";uid=" + cn.Usuario + ";database=" + cn.Database + cs;
|
||||||
|
return cs;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
144
bdEmtusa/dbcontext/tscEmtusa.cs
Normal file
144
bdEmtusa/dbcontext/tscEmtusa.cs
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
//using bdEmtusa.CompiledModels;
|
||||||
|
using bdEmtusa.db;
|
||||||
|
using bdEmtusa.dbcontext;
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Mvc.Formatters;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Reflection.Emit;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using tsEFCore8.Extensiones;
|
||||||
|
using tsUtilidades;
|
||||||
|
using tsUtilidades.Enumeraciones;
|
||||||
|
using tsUtilidades.Extensiones;
|
||||||
|
using static System.Net.Mime.MediaTypeNames;
|
||||||
|
|
||||||
|
namespace bdEmtusa
|
||||||
|
{
|
||||||
|
public class tscEmtusa : bdEmtusa.dbcontext.EmtusaContext, tsUtilidades.ItsContexto
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
public static bool Cargado = false;
|
||||||
|
private static String? _Ip = null;
|
||||||
|
public string? ip
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _Ip;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_Ip = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Aplicaciones { get; private set; }
|
||||||
|
|
||||||
|
public static readonly Microsoft.Extensions.Logging.LoggerFactory _myLoggerFactory =
|
||||||
|
new LoggerFactory(new[] {
|
||||||
|
new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider()
|
||||||
|
});
|
||||||
|
|
||||||
|
private static string? ConexionPorDefecto = null;
|
||||||
|
public static tscEmtusa NuevoContexto(string NombreConexion = "", bool Lazy = true, bool SoloLectura = false, bool ConEventoSavingChanges = true, string aplicaciones = "")
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
string? cnx = null;
|
||||||
|
if (NombreConexion == "")
|
||||||
|
{
|
||||||
|
if (ConexionPorDefecto == null) ConexionPorDefecto = Conexion.ObtieneConexionDefecto();
|
||||||
|
cnx = ConexionPorDefecto;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cnx = Conexion.ObtieneConexionDefecto(NombreConexion);
|
||||||
|
}
|
||||||
|
|
||||||
|
var ob = new DbContextOptionsBuilder<EmtusaContext>();
|
||||||
|
// ob.UseLoggerFactory(_myLoggerFactory);
|
||||||
|
// ob.UseInternalServiceProvider(<EnumeracionesService>)
|
||||||
|
ob.UseMySql(cnx, Microsoft.EntityFrameworkCore.ServerVersion.Parse("8.0.0-mysql"));
|
||||||
|
if (Lazy) ob.UseLazyLoadingProxies();
|
||||||
|
if (SoloLectura) ob.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
|
||||||
|
var Opciones = ob.Options;
|
||||||
|
tscEmtusa bd = new tscEmtusa(Opciones);
|
||||||
|
bd.Aplicaciones = aplicaciones;
|
||||||
|
if (ConEventoSavingChanges) bd.SavingChanges += GuardandoCambios;
|
||||||
|
return bd;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CambiosGuardados(object? sender, SavedChangesEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//public static Datos.BBDD ObtieneBBDD(string NombreConexion)
|
||||||
|
|
||||||
|
private static void GuardandoCambios(object? sender, SavingChangesEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public tscEmtusa(DbContextOptions<EmtusaContext> Opciones) : base(Opciones)
|
||||||
|
{
|
||||||
|
if (_Ip == null) { ip = tsEFCore8.bbdd.ObtieneIPMysql(this); }
|
||||||
|
else { ip = _Ip; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void AñadeObjeto(object Registro)
|
||||||
|
{
|
||||||
|
this.Add(Registro);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CompruebaUnico(EstadosAplicacion estado, string NombreCampo, object Valor, string NombreTablaBase, object DataContext)
|
||||||
|
{
|
||||||
|
return this.CompruebaRegistroUnico(estado == EstadosAplicacion.ModificandoRegistro, "bdEmtusa.db", NombreTablaBase, NombreCampo, Valor, DataContext);
|
||||||
|
}
|
||||||
|
public void EliminaObjeto(object Registro)
|
||||||
|
{
|
||||||
|
if (this.Entry(Registro).State == Microsoft.EntityFrameworkCore.EntityState.Detached)
|
||||||
|
{
|
||||||
|
this.Entry(Registro).State = Microsoft.EntityFrameworkCore.EntityState.Unchanged;
|
||||||
|
}
|
||||||
|
else if (this.Entry(Registro).State == Microsoft.EntityFrameworkCore.EntityState.Added)
|
||||||
|
{
|
||||||
|
this.Remove(Registro);
|
||||||
|
this.Entry(Registro).State = Microsoft.EntityFrameworkCore.EntityState.Unchanged;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.Remove(Registro);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GuardarCambios()
|
||||||
|
{
|
||||||
|
return this.SaveChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HayModificaciones()
|
||||||
|
{
|
||||||
|
return this.ChangeTracker.HasChanges();
|
||||||
|
}
|
||||||
|
public int ObtieneLongitudCampo(string NombreTablaBase, string NombreCampo)
|
||||||
|
{
|
||||||
|
return this.ObtieneMaximaLongitudCampo("bdEmtusa.db", NombreTablaBase, NombreCampo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
66
bdEmtusa/efpt.config.json
Normal file
66
bdEmtusa/efpt.config.json
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"CodeGenerationMode": 4,
|
||||||
|
"ContextClassName": "EmtusaContext",
|
||||||
|
"ContextNamespace": null,
|
||||||
|
"FilterSchemas": false,
|
||||||
|
"IncludeConnectionString": false,
|
||||||
|
"IrregularWords": null,
|
||||||
|
"MinimumProductVersion": "2.6.1382",
|
||||||
|
"ModelNamespace": null,
|
||||||
|
"OutputContextPath": "dbcontext",
|
||||||
|
"OutputPath": "db",
|
||||||
|
"PluralRules": null,
|
||||||
|
"PreserveCasingWithRegex": true,
|
||||||
|
"ProjectRootNamespace": "bdEmtusa",
|
||||||
|
"Schemas": null,
|
||||||
|
"SelectedHandlebarsLanguage": 2,
|
||||||
|
"SelectedToBeGenerated": 0,
|
||||||
|
"SingularRules": null,
|
||||||
|
"T4TemplatePath": null,
|
||||||
|
"Tables": [
|
||||||
|
{
|
||||||
|
"Name": "channels",
|
||||||
|
"ObjectType": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "configuracion",
|
||||||
|
"ObjectType": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "historico",
|
||||||
|
"ObjectType": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "items",
|
||||||
|
"ObjectType": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"UiHint": null,
|
||||||
|
"UncountableWords": null,
|
||||||
|
"UseAsyncStoredProcedureCalls": true,
|
||||||
|
"UseBoolPropertiesWithoutDefaultSql": true,
|
||||||
|
"UseDatabaseNames": true,
|
||||||
|
"UseDatabaseNamesForRoutines": true,
|
||||||
|
"UseDateOnlyTimeOnly": false,
|
||||||
|
"UseDbContextSplitting": false,
|
||||||
|
"UseDecimalDataAnnotationForSprocResult": true,
|
||||||
|
"UseFluentApiOnly": true,
|
||||||
|
"UseHandleBars": false,
|
||||||
|
"UseHierarchyId": false,
|
||||||
|
"UseInflector": false,
|
||||||
|
"UseInternalAccessModifiersForSprocsAndFunctions": false,
|
||||||
|
"UseLegacyPluralizer": false,
|
||||||
|
"UseManyToManyEntity": false,
|
||||||
|
"UseNoDefaultConstructor": false,
|
||||||
|
"UseNoNavigations": false,
|
||||||
|
"UseNoObjectFilter": false,
|
||||||
|
"UseNodaTime": false,
|
||||||
|
"UseNullableReferences": true,
|
||||||
|
"UsePrefixNavigationNaming": false,
|
||||||
|
"UseSchemaFolders": false,
|
||||||
|
"UseSchemaNamespaces": false,
|
||||||
|
"UseSpatial": false,
|
||||||
|
"UseT4": true,
|
||||||
|
"UseT4Split": false,
|
||||||
|
"UseTypedTvpParameters": true
|
||||||
|
}
|
||||||
128
swEmtusa/Controllers/AuthController.cs
Normal file
128
swEmtusa/Controllers/AuthController.cs
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
using bdCOAS.db;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using SwaggerAutenticacion.Clases;
|
||||||
|
using System.Linq.Dynamic.Core;
|
||||||
|
using tsUtilidades;
|
||||||
|
using System.Security.Claims;
|
||||||
|
|
||||||
|
|
||||||
|
namespace SwaggerAutenticacion.Controllers
|
||||||
|
{
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class AuthController : Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly IConfiguration jwtSettings;
|
||||||
|
|
||||||
|
public AuthController(IConfiguration configuration)
|
||||||
|
{
|
||||||
|
|
||||||
|
jwtSettings = configuration.GetSection("Jwt");
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost("ComprobarUser")]
|
||||||
|
public ActionResult<string> PostComprobarUser([FromBody] DatosAuth model)
|
||||||
|
{
|
||||||
|
var bd = bdCOAS.tsCOAS.NuevoContextoDirecto();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
autorizacionesexternas externo = bd.autorizacionesexternas.FirstOrDefault(x => x.Codigo == model.nombreExterno);
|
||||||
|
|
||||||
|
//var externo = bd.autorizacionesexternas.FirstOrDefault(x => x.Nombre == model.nombreExterno);
|
||||||
|
|
||||||
|
if (externo != null)
|
||||||
|
{
|
||||||
|
var pwEmpresaEncrypt = tsUtilidades.crypt.SHA1("M3Soft." + model.pwExterno);
|
||||||
|
|
||||||
|
if (pwEmpresaEncrypt != externo.HashPassword) throw new Exception("PassWord Incorrecta");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("Autorización no encontrada.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var token = "";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var sContraseñaenc = tsUtilidades.crypt.SHA1("M3Soft." + model.pwColegiado);
|
||||||
|
Exception ex = null;
|
||||||
|
accesoswebcoas nac = null;
|
||||||
|
var col = bd.Colegiados.First(x => x.NumeroColegiado == model.identificacionColegiado || x.NIF == model.identificacionColegiado);
|
||||||
|
clavesacceso.LoginCoas(bd, col.NumeroColegiado, sContraseñaenc, "", clavesacceso.TipoLoginEnum.EXTERNOS_1, ref ex, ref nac);
|
||||||
|
if (ex != null) throw ex;
|
||||||
|
|
||||||
|
externo.FechaUltimaConexion = DateTime.Now;
|
||||||
|
bd.Update(externo);
|
||||||
|
bd.SaveChanges();
|
||||||
|
|
||||||
|
token = AuthHandler.GenerateJwtToken(jwtSettings, col.idColegiado.ToString());
|
||||||
|
return Ok(new { token });
|
||||||
|
}
|
||||||
|
catch (tsExcepcion e)
|
||||||
|
{
|
||||||
|
return Unauthorized("Credenciales Colegiado no válidas. " + e.Message);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return BadRequest($"Ha ocurrido un error. Mensaje de error: {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return Unauthorized("Credenciales Empresa no válidas. " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[HttpPost("LoginExterno")]
|
||||||
|
public ActionResult<object> PostLoginExterno([FromBody] DatosAuthEmail model)
|
||||||
|
{
|
||||||
|
var bd = bdCOAS.tsCOAS.NuevoContextoDirecto();
|
||||||
|
// string ip = HttpContext.Connection.RemoteIpAddress?.ToString();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var externo = bd.autorizacionesexternas
|
||||||
|
.FirstOrDefault(x => x.Codigo == model.nombreExterno)
|
||||||
|
?? throw new Exception("Autorización no encontrada.");
|
||||||
|
|
||||||
|
var pwEncrypt = tsUtilidades.crypt.SHA1("M3Soft." + model.pwExterno);
|
||||||
|
if (pwEncrypt != externo.HashPassword)
|
||||||
|
throw new Exception("Password Incorrecta.");
|
||||||
|
|
||||||
|
// Solo guardamos nombreExterno + tipo en el token
|
||||||
|
var claims = new List<Claim>
|
||||||
|
{
|
||||||
|
new Claim(ClaimTypes.Name, model.nombreExterno),
|
||||||
|
new Claim("AuthType", "EmailOnly")
|
||||||
|
};
|
||||||
|
|
||||||
|
var token = AuthHandler.GenerateJwtToken(jwtSettings, claims);
|
||||||
|
|
||||||
|
externo.FechaUltimaConexion = DateTime.Now;
|
||||||
|
bd.Update(externo);
|
||||||
|
bd.SaveChanges();
|
||||||
|
// if (externo.Codigo!="GCOAS") tsUtilidades.TsNotificacionesClient.RegistrarAsync("LoginExterno", "Login Externo " + externo.Nombre + " - IP: " + ip, TsNotificacionesClient.TipoNotificacionEnum.INFO);
|
||||||
|
return Ok(new { token });
|
||||||
|
}
|
||||||
|
catch (Exception e) when (
|
||||||
|
e.Message.Contains("no encontrada") ||
|
||||||
|
e.Message.Contains("Incorrecta"))
|
||||||
|
{
|
||||||
|
tsUtilidades.TsNotificacionesClient.RegistrarAsync("Credenciales LoginExterno incorrectas", e.Message,TsNotificacionesClient.TipoNotificacionEnum.CRÍTICO);
|
||||||
|
return Unauthorized("Credenciales Empresa no válidas. " + e.Message);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
tsUtilidades.TsNotificacionesClient.RegistrarAsync("Error en LoginExterno", e.Message, TsNotificacionesClient.TipoNotificacionEnum.ERROR);
|
||||||
|
return BadRequest($"Ha ocurrido un error: {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
27
swEmtusa/Program.cs
Normal file
27
swEmtusa/Program.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using bdEmtusa;
|
||||||
|
|
||||||
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
// Add services to the container.
|
||||||
|
// var bd = tscEmtusa.NuevoContexto();
|
||||||
|
builder.Services.AddControllers();
|
||||||
|
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||||
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
|
builder.Services.AddSwaggerGen();
|
||||||
|
|
||||||
|
var app = builder.Build();
|
||||||
|
|
||||||
|
// Configure the HTTP request pipeline.
|
||||||
|
if (app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseSwagger();
|
||||||
|
app.UseSwaggerUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
|
app.UseAuthorization();
|
||||||
|
|
||||||
|
app.MapControllers();
|
||||||
|
|
||||||
|
app.Run();
|
||||||
41
swEmtusa/Properties/launchSettings.json
Normal file
41
swEmtusa/Properties/launchSettings.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
|
"iisSettings": {
|
||||||
|
"windowsAuthentication": false,
|
||||||
|
"anonymousAuthentication": true,
|
||||||
|
"iisExpress": {
|
||||||
|
"applicationUrl": "http://localhost:12279",
|
||||||
|
"sslPort": 44348
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"http": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"applicationUrl": "http://localhost:5245",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"applicationUrl": "https://localhost:7110;http://localhost:5245",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"IIS Express": {
|
||||||
|
"commandName": "IISExpress",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
8
swEmtusa/appsettings.Development.json
Normal file
8
swEmtusa/appsettings.Development.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
swEmtusa/appsettings.json
Normal file
9
swEmtusa/appsettings.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*"
|
||||||
|
}
|
||||||
25
swEmtusa/swEmtusa.csproj
Normal file
25
swEmtusa/swEmtusa.csproj
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="Controllers\AuthController.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\bdEmtusa\bdEmtusa.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Controllers\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
6
swEmtusa/swEmtusa.http
Normal file
6
swEmtusa/swEmtusa.http
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
@swEmtusa_HostAddress = http://localhost:5245
|
||||||
|
|
||||||
|
GET {{swEmtusa_HostAddress}}/weatherforecast/
|
||||||
|
Accept: application/json
|
||||||
|
|
||||||
|
###
|
||||||
Reference in New Issue
Block a user