使用Umbraco.Core.Persistence从枚举模型创建数据库表

时间:2015-02-20 16:00:04

标签: c# umbraco umbraco7

想要在应用程序启动时创建此表(如果它不存在)。

代码:

public class Database : ApplicationEventHandler
{
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        var db = applicationContext.DatabaseContext.Database;

        //Cant add this table due to the ENUM
        if (!db.TableExist("FormData"))
        {
            db.CreateTable<FormData>(false);
        }
    }
}

型号:

[PrimaryKey("Id")]
public class FormData
{
    [PrimaryKeyColumn(AutoIncrement = true, IdentitySeed = 1)]
    public int Id { get; set; }

    [NullSetting(NullSetting = NullSettings.NotNull)]
    public FormType Type { get; set; }

    [NullSetting(NullSetting = NullSettings.NotNull)]
    public string Data { get; set; }

    [NullSetting(NullSetting = NullSettings.NotNull)]
    public DateTime Date { get; set; }
}

错误讯息:

  

[InvalidOperationException:Sequence不包含匹配元素]      System.Linq.Enumerable.First(IEnumerable 1 source, Func 2谓词)+415      Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase 1.FormatType(ColumnDefinition column) +1225 Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase 1.Format(ColumnDefinition列)+155      Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase 1.Format(IEnumerable 1列)+144      Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase`1.Format(TableDefinition table)+131      Umbraco.Core.Persistence.PetaPocoExtensions.CreateTable(Database db,Boolean overwrite,Type modelType)+161      Umbraco.Core.Persistence.PetaPocoExtensions.CreateTable(数据库db,布尔覆盖)+121

看看错误我不认为有一个解决方案没有更新核心,但这里是希望你们可以帮助

3 个答案:

答案 0 :(得分:4)

根据@Ryios给出的答案,我认为这样的事情很好:

/// <summary>
/// Don't use this to get or set.
/// This must however be kept as public or db.CreateTable()
/// will not insert this field into the database.
/// </summary>
[NullSetting(NullSetting = NullSettings.NotNull)]
[Column("type")]
public int _type { get; set; }

/// <summary>
/// This field is ignored by db.CreateTable().
/// </summary>
[Ignore]
public FormType Type
{
    get
    {
        return (FormType)_type;
    }
    set
    {
        _type = (int)value;
    }
}

在代码中,应使用Type而不是_type,以便枚举可以受益。 _type仅作为插入数据库表的字段出现。

答案 1 :(得分:3)

如果不修改PetaPoco或使用其他分叉,您可以使用这样的解决方案,

[Column(type), NullSetting(NullSetting = NullSettings.NotNull)]
public int TypeAsInt { get; set; }

[Ignore]
public FormType TypeAsEnum { get { return (FormType)TypeAsInt; } }

Peta poco将忽略使用Ignore标记的属性,这意味着在创建表或选择结果时不会尝试使用它们。相反,TypeAsInt将在表中创建为int类型。

然后在您的代码中,只要您想要从TypeAsInt转换的FormType版本,就可以使用TypeAsEnum。

答案 2 :(得分:1)

我认为问题是因为你的类上有非sql类型,所以它不知道如何处理它。特别是,您有一个名为“FormType”的属性,其类型为“FormType”。 PetaPoco不知道SQL列类型是什么。如果要自动创建表,则需要确保您的类仅使用可映射到SQL列类型的属性类型。

您可能还会遇到一些问题,例如,如果您希望列为nvarchar(max),则无法告诉持久层执行max,因此您必须将其设置为nvarchar(x)其中x是一个数字,然后在创建表后运行alter语句将类型更改为nvarchar(max)。