Ho creato un'API Web utilizzando .Net Core 1.1 e EF Core. Il backend è un database MySQL, quindi ho incluso "MySql.Data.EntityFrameworkCore": dipendenza "7.0.6-IR31" nel file project.json.
Ho un modello semplice nel mio progetto. Sto cercando di mappare le colonne del mio modello alle colonne in un database esistente. Così sto usando le annotazioni di dati. Ho questo:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace PropWorxAPI.Models
{
[Table("files")]
public partial class File
{
[Key]
[Column("file_id")]
public int FileId { get; set; }
[Required]
[Column("file_num")]
[MaxLength(50)]
public string FileNum { get; set; }
[MaxLength(255)]
public string Description { get; set; }
}
}
Voglio proprietà FileId per mappare al campo id_file nel database. Tuttavia, quando eseguo il progetto, si lamenta che non vi è alcun campo FileId nel database. È quasi come se le mie annotazioni di mappatura delle colonne fossero completamente ignorate. Qualche idea? Grazie...
Nel caso in cui, includo il mio file project.json di seguito:
{
"dependencies": {
"MySql.Data.EntityFrameworkCore": "7.0.6-IR31",
"Microsoft.AspNetCore.Mvc": "1.1.0",
"Microsoft.AspNetCore.Routing": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
"Microsoft.Extensions.Configuration.Json": "1.1.0",
"Microsoft.Extensions.Logging": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.Extensions.Logging.Debug": "1.1.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
"Microsoft.NETCore.App": {
"version": "1.1.0",
"type": "platform"
}
},
"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final"
},
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"portable-net45+win8"
]
}
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
},
"publishOptions": {
"include": [
"wwwroot",
"**/*.cshtml",
"appsettings.json",
"web.config"
]
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
Ho avuto anche questo problema, l'unica soluzione che ho trovato è stato usare l'API fluente per definire i mapping rispetto alle annotazioni. Per esempio
builder.Entity<Product>().ToTable("product").HasKey(m => m.Id);
builder.Entity<Product>().Property(p => p.DateAdded).HasColumnName("date_added");
builder.Entity<Product>().Property(p => p.ImageUrl).HasColumnName("image_url");
Speriamo che il supporto per le annotazioni sarà presto disponibile.
Volevo evitare l'utilizzo dell'API Fluent perché preferivo che le mappature delle colonne fossero gestite sulle proprietà effettive, quindi ho creato il mio mapping di colonne usando la reflection.
Vedere il codice nella funzione OnModelCreating
per le parti pertinenti.
Nota Stavo usando MySql e il codice non è stato testato al 100%.
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore.Extensions;
using System.Reflection;
namespace MyProject
{
public class DatabaseContext : DbContext
{
private string _connectionString;
public DbSet<Entity> Entities { get; set; }
public DatabaseContext(string connectionString)
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(_connectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// I couldn't get attribute mapping to work, so I
// had to do the mapping programmatically myself.
// Ideally we'd remove this code an rely on the
// built-in code to handle it, but we need to wait
// for MySql to support mapping in EF Core.
var type = typeof(Entity);
var properties = type
.GetTypeInfo()
.GetProperties(BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly);
foreach (var property in properties)
{
System.Console.WriteLine(property.Name);
var ignore = property.GetCustomAttribute<NotMappedAttribute>();
if (ignore != null)
{
modelBuilder
.Entity(type)
.Ignore(property.Name);
continue;
}
var column = property.GetCustomAttribute<ColumnAttribute>();
if (column == null)
{
modelBuilder
.Entity(type)
.Property(property.Name)
.HasColumnName(property.Name);
continue;
}
modelBuilder
.Entity(type)
.Property(property.Name)
.HasColumnName(column.Name);
}
}
}
}