.Net Core / EF核心模型(MySQL後端)中忽略數據註釋

asp.net-mvc asp.net-web-api entity-framework-core

我使用.Net Core 1.1和EF Core創建了一個Web API。後端是一個MySQL數據庫,所以我在project.json文件中包含了“MySql.Data.EntityFrameworkCore”:“7.0.6-IR31”依賴項。

我的項目中有一個簡單的模型。我試圖將模型中的列映射到現有數據庫中的列。所以我正在使用數據註釋。我有這個:

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

一般承認的答案

我也有這個問題,我能找到的唯一解決方案是使用流暢的API來定義映射而不是註釋。例如

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");

希望很快就能獲得對註釋的支持。


熱門答案

我想避免使用Fluent 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);

            }
        }
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow