EF核心枚举类引发异常



我使用的枚举类如下:

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来提供与BillTransactionStateint之间的映射。

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已经修复了这个(相关问题(

最新更新