Đây là một trong số ít các vấn đề có vấn đề với Entity Framework. Giả sử bạn có một lớp học giống như sau:
public class MyEntity
{
// Id is a PK on the table with Auto-Increment
public int Id { get; set; }
// CreatedOn is a datetime, with a default value
public DateTime CreatedOn { get; set; }
}
Bây giờ, bạn muốn chèn một phần tử mới:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework biết cách xử lý khóa chính tăng tự động nhờ định nghĩa trong EDMX. Nó sẽ không cố gắng chèn giá trị cho Id
tài sản. Tuy nhiên, liên quan đến Entity Framework, CreatedOn
có một giá trị:DateTime
mặc định . Bởi vì Entity Framework không thể nói "tốt, nó có một giá trị nhưng tôi nên bỏ qua nó", nó sẽ chủ động chèn bản ghi với CreatedOn
giá trị thuộc tính, bỏ qua giá trị mặc định trên định nghĩa cột trên bảng của bạn.
Không có cách nào dễ dàng để làm điều này. Bạn có thể chủ động đặt CreatedOn
thuộc tính thành DateTime.Now
khi bạn chèn mục đó. Hoặc bạn có thể tạo một giao diện và một cặp phương thức mở rộng:
public interface ICreatedOn
{
public DateTime CreatedOn { get; set; }
}
public partial class MyEntity : ICreatedOn
{
}
public static TEntity AsNew<TEntity>(this TEntity entity) where TEntity : ICreatedOn
{
if(entity != null)
entity.CreatedOn = DateTime.Now;
return entity;
}
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity().AsNew())
}
Chỉnh sửa: Để mở rộng về điểm này, lý do tại sao đây là một vấn đề không thể giải quyết là vì ý nghĩa đằng sau autoincrement
trường và một trường có default
ràng buộc giá trị. Theo định nghĩa, trường tăng tự động phải luôn được máy chủ xử lý, sử dụng một hạt giống và tất cả nhạc jazz đó. Bạn không thể chỉ định giá trị cho trường tự động tăng trên một phụ trang trừ khi bạn đã sử dụng SET IDENTITY INSERT ON
. Tuy nhiên, một giá trị mặc định chỉ là một gợi ý nói rằng "nếu tôi không chỉ định bất kỳ giá trị nào, hãy sử dụng giá trị này". Bởi vì các loại giá trị trong .NET không thể là null, sẽ luôn có một giá trị và Entity Framework không thể suy ra rằng mặc định giá trị cho trường đó, tại thời điểm đó, có nghĩa là bạn muốn nó được đặt mặc định trên máy chủ SQL.