我一直在学习如何使用EF一个星期左右,我一直坚持创建/更新我的数据库的问题.如果不存在,我可以创建一个初始化器来创建数据库:
static class Program
{
static void Main()
{
Database.SetInitializer<GumpDatabase>(new GumpDatabaseInitializer());
....
class GumpDatabaseInitializer : CreateDatabaseIfNotExists<GumpDatabase>
{
public GumpDatabaseInitializer()
{
}
protected override void Seed(GumpDatabase context)
{
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Stations (Name)");
// Other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
或者我可以创建配置来迁移数据库
static class Program
{
static void Main()
{
Database.SetInitializer<GumpDatabase>(new MigrateDatabaseToLatestVersion<GumpDatabase, Configuration>());
....
internal sealed class Configuration : DbMigrationsConfiguration<GumpDatabase>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
}
protected override void Seed(GumpDatabase context)
{
}
Run Code Online (Sandbox Code Playgroud)
每个都正常工作,但我还没有想出办法做到这两点.我可以通过更改SetInitializer调用在两个初始化程序之间切换,但是如果我想创建数据库,如果它不存在,并且如果它是我该怎么做的话还要迁移它?我需要创建自定义初始化程序吗?
谢谢
根据NSGaga答案编辑
class …Run Code Online (Sandbox Code Playgroud) 我试图通过控制台shell(最终通过cron作业)从CakePHP 2.1.2发送电子邮件.我发送的视图是一个日历,其中包含指向应用程序网页的链接.我发现的问题是网址没有包含正确的路径,而且我读到的是因为我使用控制台没有请求对象.例如,如果我在浏览器中创建视图,我会得到如下链接:
http://localhost/ReportMonitor/scheduledReports/index/show_date:2012-06-10/result:GOOD
Run Code Online (Sandbox Code Playgroud)
但在使用相同代码的电子邮件中,我得到了这个:
http://localhost/scheduledReports/index/show_date:2012-06-10/result:GOOD
Run Code Online (Sandbox Code Playgroud)
这很近,但没有雪茄.
我一直试图找到我可以设置的全局,只是硬编码app子目录,但还没有找到任何有用的东西.链接由以下代码生成:
$newUrl = array();
$newUrl['controller'] = 'scheduledReports';
$newUrl['action'] = 'index';
$newUrl['url'] = array();
foreach ($data as $key => $value) {
$newUrl['show_date'] = "$year-$month-$key";
$newUrl['result'] = 'GOOD';
$data[$key]['num_complete'] = $this->Html->link(__('Complete: ') . $value['num_complete'], Router::reverse($newUrl, true), array('class' => 'green'));
Run Code Online (Sandbox Code Playgroud)
我认为这是一个常见的功能(在控制台生成的电子邮件中发送有效的URL),但我无法弄明白.
谢谢
我刚刚创建了一个实体框架代码优先模型(我已经编写了其他C#程序,但没有编写实体框架).我创建了一个这样的模型:
class Preferences
{
[Key]
public string StationName { get; set; }
[MaxLength(30)]
public string MainDatabase { get; set; }
[MaxLength(30)]
public string DefaultSequence { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后有一个小程序来添加记录
var newPrefs = new Preferences
{
StationName = "MATT",
DefaultSequence = "NONE",
MainDatabase = "NONE"
};
Preferences prefs = foo.Preferences.Add(newPrefs);
Run Code Online (Sandbox Code Playgroud)
然后尝试创建数据库,并在添加带错误的主键时失败
"BLOB/TEXT column 'StationName' used in key specification without a key length"
Run Code Online (Sandbox Code Playgroud)
因为它使用数据类型"mediumtext"而不是CHAR或VARCHAR而MySQL不能将该类型用于键.
是否有一种方法仍然或多或少与数据库无关,它将告诉MySQL使用键列的首选类型?或者我只需要放弃并制作整数键?
我也尝试过像这样的设计变化,但没有任何效果.
class Preferences
{
[Key,DataType("CHAR"),StringLength(30)]
public string StationName { get; set; }
[MaxLength(30)]
public string MainDatabase …Run Code Online (Sandbox Code Playgroud)