正如 MaDOS 所提到的,mySql 并不受支持。如果您仍然想使用 EF,则必须先尝试代码。
您必须编写映射类,并告诉 EF 它不应该更改数据库。
禁用 db-changes 的示例上下文
public class MySqlDbContext : DbContext
{
public DbSet<MyOrderClass> Orders { get; set; }
public MySqlDbContext(IDbConnection connection)
: base((DbConnection)connection, false)
{
Database.SetInitializer<MySqlDbContext>(null); // Disable db-changes by dbContext
}
}
您的主要问题是数据类型。在 MS 世界之外,并非所有数据类型都受支持(Oracle 在 DateTime 方面也遇到了一些问题)。在下面的示例类中,“Created”列被处理为字符串,它总是有效的。在您的 .Net 应用程序中,您必须实现映射到所需类型的“转换器”属性。
带有映射配置的示例类
[Table("TORDERS")]
public class MyOrderClass
{
[Column("ORDERID")]
public long Id { get; set; }
[Column("CREATED")]
public string CreatedString { get; set; }
[NotMapped]
public DateTime? Created
{
get
{
DateTime tmp;
if (DateTime.TryParse(this.CreatedString, out tmp))
return tmp;
return null;
}
set
{
this.CreatedString = value.HasValue ? value.Value.ToString("yyyy-MM-dd HH:mm:ss") : null;
}
}
}
static void Main(params string[] args)
{
MyOrderClass tmp = new MyOrderClass() { CreatedString = "2018-01-01 11:11:11"};
Console.WriteLine(tmp.Created.ToString()); // This is how you want to work
tmp.Created = null;
Console.WriteLine(tmp.CreatedString); // this is surely not what you want to do
tmp.Created = new DateTime(2018,02,02,10,10,10);
Console.WriteLine(tmp.CreatedString); // Check if setter works ;)
}
我没有更新哪些类型可以工作,但是有了这个你就可以一直使用 EF。
我们前段时间使用它来访问现有的数据库,无论如何它都有一个糟糕的数据库模式,因为我们无论如何都要设置数据类型的模式;)。