[英]EntityFramework Core 1.1.1 - Replacing old collection with new and overwriting values
[英]EntityFramework Core 2 Default Values
我正在嘗試在幾個EF模型上使用默認值,並且注意到我誤解了HasDefaultValue
行為或它無法正常工作。
我有下表和支持模型
CREATE TABLE [dbo].[packages]
(
[Scnumber] BIGINT NOT NULL,
[PU] INT NOT NULL,
[State] SMALLINT NOT NULL DEFAULT 0,
[Status] [smallint] NOT NULL,
[Created] DATETIME NOT NULL DEFAULT GETDATE(),
CONSTRAINT [PK_packages] PRIMARY KEY CLUSTERED ([Scnumber] ASC) ON [PRIMARY],
)
[Table("packages", Schema = "dbo")]
public class Package
{
[Key]
[Column(TypeName = "bigint")]
public long Scnumber { get; set; }
[Column]
[Required]
public int PU { get; set; }
[Column(TypeName = "smallint")]
[Required]
public PackageStatus Status { get; set; }
[Column(TypeName = "tinyint")]
public RecordState State { get; set; }
[Column]
public DateTime? Created { get; set; }
}
為了應用默認值,我還在OnModelCreating()
了以下內容
modelBuilder.Entity<Package>(entity =>
{
entity.Property(r => r.State)
.HasDefaultValue(RecordState.Active);
entity.Property(r => r.Created)
.HasDefaultValue(DateTime.Now);
});
當我嘗試保存新對象時,出現以下異常:
SqlException:無法將值NULL插入表“ app.dbo.packages”的“狀態”列中; 列不允許為空。 INSERT失敗。
就像我在保存對象之前檢查對象一樣,它具有默認值,但是卻出現此異常,這令人困惑。 我知道最簡單的解決方案是僅在創建對象時確保設置狀態值,但這HasDefaultValue
的目的。
-編輯-
當我嘗試添加新對象時,請執行以下操作
var package = new Package { Scnumber = 0123456718, PU = 1001 };
_context.Packages.Add(region);
_context.SaveChanges();
一切都沒有超出正常范圍,但失敗了,但是如果我運行以下命令,它將起作用
var package = new Package {Scnumber = 0123456718, PU = 1001, Status = PackageStatus.Rejected, State = RecordState.Staging, Created = DateTime.Now };
_context.Packages.Add(region);
_context.SaveChanges();
public enum PackageStatus : short
{
New,
PendingValidation,
CheckedOut,
Approved,
Rejected,
PendingRender,
Rendered,
RenderFailed,
PendingPrint,
Printed,
PrintFailed,
Cancelled,
PendingDownload,
Downloaded,
DownloadError,
SystemUpdated,
}
public enum RecordState : byte
{
Active,
Deleted,
Staging,
}
我的當前項目中有一個.HasDefaultValueSql("((0))")
。
還發現了.HasDefaultValueSql("getdate()")
和.HasDefaultValue(3);
在這里 。
我遇到了同樣的問題。 在OnModelCreating
進行更新后,您必須將遷移應用於數據庫。 編寫dotnet ef migrations add defaultValuesAddedToPackage
,然后dotnet ef database update
。 這使列類型成為默認值,因此您無需在新實體或sql插入中顯式設置。 如果編寫dotnet ef migrations script
則會看到類似ALTER TABLE [packages] ADD DEFAULT 0 FOR [State];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.