.Net Core Entity Framework MySQL - 文字列フィールドには255個のシンボルしか格納されません

.net-core entity-framework-core mysql-5.7

質問

Visual Studio 2015を使用して、.NET Core、Entity Framework、およびMySQL 5.7をWindowsで使用してアプリケーションを作成しています.EFを使用してコンソールアプリケーション用にVS2015に新しい簡単な.netコアプロジェクトを作成しました。私のデータモデルはID(int)とBody(string)フィールドを持つ単一の型のArticleで構成されています。データベースを作成するとき:

> dotnet ef migrations add initial_migration
> dotnet ef database update

私のデータモデルの文字列フィールド(Article.Body)は、Column属性[Column(TypeName = "TEXT")]で設定した内容に関係なく、VARCHAR(255)型をデータベースに取得します。したがって、長い文字列を保存すると、255文字に切り詰められます。

さらに、データベース設定に行き、Body列を変更してMySQL WorkbenchでTEXTを入力すると、まだ文字列は255文字で切り捨てられます。私は間違って何をしていますか?

簡単にするために、すべてのコード(dbコンテキスト、モデル)をProgram.csに入れました。

Program.cs

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using MySQL.Data.EntityFrameworkCore.Extensions;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace netcore
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ArticlesContext context = ArticlesContext.Create();

            Article a = new Article();
            a.Body = @"If one puts some long string here, than only first 255 characters will be saved.";

            context.Add(a);
            context.SaveChanges();
        }
    }

    // DB Context
    public class ArticlesContext : DbContext
    {
        private static string _conStr = @"server=localhost;userid=sevka;pwd=12321;port=3306;database=netcore;sslmode=none;";

        public ArticlesContext() : base() { }

        public ArticlesContext(DbContextOptions<ArticlesContext> options)
        : base(options)
        { }

        public static ArticlesContext Create()
        {
            var optionsBuilder = new DbContextOptionsBuilder<ArticlesContext>();
            optionsBuilder.UseMySQL(_conStr);

            //Ensure database creation
            var context = new ArticlesContext(optionsBuilder.Options);
            context.Database.EnsureCreated();

            return context;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL(_conStr);
        }

        public DbSet<Article> Articles { get; set; }
    }

    public class Article
    {
        public int ID { get; set; }

        [Column(TypeName = "TEXT")]
        public string Body { get; set; }
    }
}

Project.json

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.ApplicationInsights.AspNetCore": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "MySQL.Data.Core": "7.0.4-IR-191",
    "MySql.Data.EntityFrameworkCore": "7.0.6-IR31"
  },

  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  }
}

受け入れられた回答

あなたのフィードバックによると、データ注釈の代わりに流暢なAPIを使用する必要があります。私はEFコアで流暢なAPIを使用する方が良いことを知っています。これは将来のバージョンで変更される可能性があります。

dbコンテキストでは、エンティティのマッピングを次のように設定できます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  var entity = modelBuilder.Entity<Entity>();

  entity.Property(p => p.Body).HasColumnType("text");

  base.OnModelCreating(modelBuilder);
}

よりスタイリッシュなエンティティマッピングが必要な場合は、このチュートリアルを参照してください。VS 2015でASP.NET Core Template Packを使用してAngular2アプリケーションを作成するこのチュートリアルは、SQL ServerのEFコア向けですが、MySqlにも適用されます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ