2017-01-13 14 views
2

.Net Core 1.1とEF Coreを使用してWeb APIを作成しました。バックエンドはMySQLデータベースなので、"MySql.Data.EntityFrameworkCore": "7.0.6-IR31" project.jsonファイルに依存しています。.Net Core/EFコアモデル(MySQLバックエンド)でデータ注釈が無視される

私のプロジェクトには単純なモデルがあります。モデルの列を既存のデータベースの列にマップしようとしています。だから私はデータ注釈を使用しています。

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; } 
     } 
    } 

は私が財産FILEIDがデータベースにのfile_idをフィールドにマップしたい:私はこれを持っています。しかし、プロジェクトを実行すると、データベースにフィールドFileIdが存在しないと不平を言います。まるでカラムマッピングアノテーションが完全に無視されているかのようです。何か案は?おかげで...

念のために、私は以下の私のproject.jsonファイルを含む午前:

{ 
    "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%" ] 
    } 
} 
+0

エンティティフレームワーク6のデータアクセスレイヤを使用して、ASP.NET Webフォームで同じ問題が発生しました。私は、コンソールランナーを介してデータアクセス層でテストし、context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s)で作成されたSQLを出力するまで歩き回り、すべてが一致します。私はwebformアプリケーションを実行し、SQLはテーブル名としてクラス名を使用しようとし、テーブルが見つからないために失敗します。データアノテーションから流暢なAPIに変更しました。今はすべてが機能しています。私はEntityFrameworkCoreの問題であると思われます。 – Rourke

答えて

2

私はこの問題は、あまりにも、私は見つけることができる唯一のソリューションは、マッピングを定義するために流暢なAPIを使用していたました注釈とは対照的に例えば。

すぐにアノテーションのサポートが提供されることを望みます。

0

私はので、私はリフレクションを使用して独自の列マッピングを構築し、実際の性質に処理する列マッピングを好適なので、私は流暢APIを使用しないようにしたかったです。

関連する部品については、OnModelCreatingのコードを参照してください。

私はMySqlを使用していましたが、コードは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); 

      } 
     } 
    } 
} 
関連する問題