Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Entity Framework - giá trị mặc định không được đặt trong bảng máy chủ sql

Đâ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 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để bạn thêm một cột NOT NULL vào một bảng lớn trong SQL Server?

  2. cú pháp cho MERGE hàng đơn / upert trong SQL Server

  3. Cách thêm cột nhận dạng vào bảng cơ sở dữ liệu hiện có có số lượng hàng lớn

  4. SQL Server dbo.sysdiagrams là một bảng người dùng hoặc bảng hệ thống

  5. Được phân tách bằng dấu phẩy Danh sách tất cả các cột trong Cơ sở dữ liệu (Tên bảng | Tên_mạch ...)