使用 Umbraco.Core.Persistence 从带有枚举的模型创建数据库 table
Create Database table from model with enum using Umbraco.Core.Persistence
想要在应用程序启动时创建 table 如果它不存在。
代码:
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 contains no matching element]
System.Linq.Enumerable.First(IEnumerable1 source, Func
2 predicate) +415
Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase1.FormatType(ColumnDefinition column) +1225
Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase
1.Format(ColumnDefinition column) +155
Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase1.Format(IEnumerable
1 columns) +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(Database db, Boolean overwrite) +121
查看错误我认为没有更新核心的解决方案但是希望你们能提供帮助
我认为问题是因为您的 class 上有一个非 sql 类型,所以它不知道如何处理它。特别是你有一个名为 "FormType" 的 属性,它的类型是 "FormType"。 PetaPoco 不知道 SQL 列类型是什么。如果您想自动创建 table,您需要确保您的 class 仅使用可以映射到 SQL 列类型的 属性 类型。
您可能还会 运行 遇到一些问题,例如,如果您希望列为 nvarchar(max),则无法告诉持久层执行 max,因此您必须设置它到 nvarchar(x) 其中 x 是一个数字,然后 运行 在创建 table.
之后将类型更改为 nvarchar(max) 的 alter 语句
无需修改 PetaPoco 或使用不同的分支,您可以使用这样的解决方案,
[Column(type), NullSetting(NullSetting = NullSettings.NotNull)]
public int TypeAsInt { get; set; }
[Ignore]
public FormType TypeAsEnum { get { return (FormType)TypeAsInt; } }
Peta poco 将忽略标记为 Ignore 的属性,这意味着它不会在创建 table 或选择结果时尝试使用它们。相反,TypeAsInt 将在 table 中创建为 int 类型。
然后在您的代码中,您可以在需要从 TypeAsInt 转换的 FormType 版本时随时使用 TypeAsEnum。
根据@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
仅作为插入数据库的字段出现 table。
想要在应用程序启动时创建 table 如果它不存在。
代码:
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 contains no matching element] System.Linq.Enumerable.First(IEnumerable
1 source, Func
2 predicate) +415 Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase1.FormatType(ColumnDefinition column) +1225 Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase
1.Format(ColumnDefinition column) +155 Umbraco.Core.Persistence.SqlSyntax.SqlSyntaxProviderBase1.Format(IEnumerable
1 columns) +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(Database db, Boolean overwrite) +121
查看错误我认为没有更新核心的解决方案但是希望你们能提供帮助
我认为问题是因为您的 class 上有一个非 sql 类型,所以它不知道如何处理它。特别是你有一个名为 "FormType" 的 属性,它的类型是 "FormType"。 PetaPoco 不知道 SQL 列类型是什么。如果您想自动创建 table,您需要确保您的 class 仅使用可以映射到 SQL 列类型的 属性 类型。
您可能还会 运行 遇到一些问题,例如,如果您希望列为 nvarchar(max),则无法告诉持久层执行 max,因此您必须设置它到 nvarchar(x) 其中 x 是一个数字,然后 运行 在创建 table.
之后将类型更改为 nvarchar(max) 的 alter 语句无需修改 PetaPoco 或使用不同的分支,您可以使用这样的解决方案,
[Column(type), NullSetting(NullSetting = NullSettings.NotNull)]
public int TypeAsInt { get; set; }
[Ignore]
public FormType TypeAsEnum { get { return (FormType)TypeAsInt; } }
Peta poco 将忽略标记为 Ignore 的属性,这意味着它不会在创建 table 或选择结果时尝试使用它们。相反,TypeAsInt 将在 table 中创建为 int 类型。
然后在您的代码中,您可以在需要从 TypeAsInt 转换的 FormType 版本时随时使用 TypeAsEnum。
根据@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
仅作为插入数据库的字段出现 table。