我使用的枚举类如下:
public class BillTransactionState
{
public static readonly BillTransactionState Initialized = new BillTransactionState(1, "Initialized");
public static readonly BillTransactionState Invoiceable = new BillTransactionState(2, "Invoiceable");
public static readonly BillTransactionState NoSow = new BillTransactionState(3, "NoSow");
public static readonly BillTransactionState Invoiced = new BillTransactionState(4, "Invoiced");
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
我有另一个引用BillTransactionState的类:
public class BillTransactionStateHistory : IEntity<long>
{
public long Id { get; set; }
public DateTime EffectiveDate { get; set; }
public BillTransactionState BillTransactionState { get; set; }
}
在我的webapi中,当我做这样的事情时:
var billTransactionStateHistory = new BillTransactionStateHistory ({
BillTransaction = BillTransaction .Initialized,
EffectiveDate = DateTime.Now
});
_dbContext.BillTransactionStateHistories.AddAsync(billTransactionStateHistory)
我得到一个错误:
BillTransactionState的标识插入处于关闭状态。
我意识到EF Core正试图在BillTransactionState表中插入值为1(表示Id(和"Initliazed"的行。如何阻止EF Core尝试在此枚举类中插入行。如有任何帮助,我们将不胜感激。非常感谢。
如下编写BillTransactionStateHistory
模型类:
public class BillTransactionStateHistory : IEntity<long>
{
public long Id { get; set; }
public DateTime EffectiveDate { get; set; }
public int BillTransactionState { get; set; }
}
注意:之后不要忘记相应地更新数据库
然后在Web API方法:
var billTransactionStateHistory = new BillTransactionStateHistory ()
{
BillTransactionState = BillTransactionState.Initialized.Id,
EffectiveDate = DateTime.Now
};
_dbContext.BillTransactionStateHistories.AddAsync(billTransactionStateHistory)
您可以在官方EF Core GitHub存储库中看到这个答案。
枚举类和实体类将保持不变。您必须引入ValueConverter
或使用PropertyBuilder.HasConverter
来提供与BillTransactionState
和int
之间的映射。
Lambda示例:
// builder is IEntityTypeConfiguration<BillTransactionStateHistory>
builder.Property(e => e.BillTransactionState)
.HasColumnName("state")
.HasConversion(state => state.Id, stateId => SomeLookupMethod(stateId));
public BillTransactionState SomeLookupMethod(int id)
{
// TODO: Lookup transaction state based on id.
}
请注意EF Core 2.x在值转换器和Lambda正确映射到查询表达式方面存在问题。EF Core 3.x已经修复了这个(相关问题(