这似乎不是 Pomelo 或 EF Core 的问题,因为以下确实按预期工作:
- 创建一个包含以下内容的项目:
项目.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.7">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="5.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.7" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.0" />
</ItemGroup>
</Project>
程序.cs:
using System;
using System.Diagnostics;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace IssueConsoleTemplate
{
public class IceCream
{
public int IceCreamId { get; set; }
public string Name { get; set; }
public DateTime BestServedBefore { get; set; }
}
public class ExpiredIceCream
{
public int IceCreamId { get; set; }
public string Name { get; set; }
public DateTime BestServedBefore { get; set; }
public int DaysExpired { get; set; }
}
public class Context : DbContext
{
public DbSet<IceCream> IceCreams { get; set; }
public DbSet<ExpiredIceCream> ExpiredIceCreams { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
var connectionString = "server=127.0.0.1;port=3306;user=root;password=;database=So67919519_01";
var serverVersion = ServerVersion.AutoDetect(connectionString);
optionsBuilder.UseMySql(connectionString, serverVersion)
.UseLoggerFactory(
LoggerFactory.Create(
configure => configure
.AddConsole()
.AddFilter(level => level >= LogLevel.Information)))
.EnableSensitiveDataLogging()
.EnableDetailedErrors();
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<IceCream>()
.HasData(
new IceCream {IceCreamId = 1, Name = "Vanilla", BestServedBefore = new DateTime(2021, 1, 1)},
new IceCream {IceCreamId = 2, Name = "Chocolate", BestServedBefore = new DateTime(2021, 5, 15)},
new IceCream {IceCreamId = 3, Name = "Matcha", BestServedBefore = DateTime.Today.AddYears(5)});
modelBuilder.Entity<ExpiredIceCream>(
entity =>
{
entity.ToView("ExpiredIceCreams");
entity.HasNoKey();
});
}
}
internal static class Program
{
private static void Main()
{
using var context = new Context();
var expiredIceCreams = context.ExpiredIceCreams.ToList();
Trace.Assert(expiredIceCreams.Count == 2);
}
}
}
创建初始迁移:
dotnet ef migrations add Initial
将以下代码添加到Up()
生成Migrations/..._Initial.cs
文件中方法的末尾:
migrationBuilder.Sql(@"
CREATE VIEW `ExpiredIceCreams` AS
SELECT *, DATEDIFF(CURDATE(), `BestServedBefore`) AS DaysExpired
FROM `IceCreams`
WHERE `BestServedBefore` <= CURDATE();");
将以下代码添加到Down()
生成Migrations/..._Initial.cs
文件中方法的开头:
migrationBuilder.Sql(@"DROP VIEW `ExpiredIceCreams`;");
更新您的数据库:
dotnet ef database update
运行项目以确保它按预期工作。
然后添加第二个迁移:
dotnet ef migrations add Second
看一下生成的Migrations/..._Second.cs
文件。它不应包含有关您的ExpiredIceCreams
视图的任何操作。
从这往哪儿走
我将从区分新旧...<MigrationName>.Design.cs
文件开始,看看发生了什么。
随意发布您的迁移文件内容,以便我们查看。
(也许这与某些字符集或排序规则问题/更改有关。)