Notmapped là gì

Thuộc tính NotMapped trong Entity Framework

Thuộc tính NotMapped [NotMapped Attribute] có thể được áp dụng cho các thuộc tính của lớp thực thể mà chúng ta không muốn tạo các cột tương ứng trong cơ sở dữ liệu.

Theo mặc định, EF tạo một cột cho mỗi thuộc tính [phải có get; và set;] trong một lớp thực thể. Thuộc tính NotMapped ghi đè quy ước mặc định này.

Bạn có thể áp dụng thuộc tính NotMapped trên một hoặc nhiều thuộc tính mà bạn KHÔNG muốn tạo cột tương ứng trong bảng cơ sở dữ liệu.

Khai báo thuộc tính NotMaps: [NotMapped]

using System.ComponentModel.DataAnnotations.Schema; public class Student { public int StudentId { get; set; } public string StudentName { get; set; } [NotMapped] public int Age { get; set; } }

Trong ví dụ trên, thuộc tính NotMapped được áp dụng cho thuộc tính Age của lớp Student. Vì vậy, EF sẽ không tạo một cột để lưu trữ thông tin Age trong bảng db Students, như được hiển thị bên dưới.

Lưu ý: EF cũng không tạo cột cho thuộc tính không có getters hoặc setters [thuộc tính chỉ đọc hoặc chỉ ghi]. Ví dụ, EF sẽ không tạo các cột cho các thuộc tính City và Age.

using System.ComponentModel.DataAnnotations; public class Student { private int _age = 0; public int StudentId { get; set; } public string StudentName { get; set; } public string City { get{ return StudentName;} } public int Age { set{ _age = value;} } }

Attribute chú thích dữ liệu trong Entity Framework

Đăng bởi Trung Nguyen 2 năm trước trong Entity Framework

Attribute [thuộc tính] chú thích dữ liệu là các thuộc tính .NET có thể được áp dụng trên một lớp thực thể hoặc thuộc tính để ghi đè các quy ước mặc định trong EF 6 và EF Core.

Các attribute chú thích dữ liệu có trong namespace System. ComponentModel. DataAnnotations và System. ComponentModel. DataAnnotations. Schema trong EF 6 cũng như trong EF Core.

Các thuộc tính này không chỉ được sử dụng trong Entity Framework mà chúng còn có thể được sử dụng trong ASP.NET WebForm và ASP.NET MVC hoặc các điều khiển dữ liệu.

Các attribute chú thích dữ liệu này hoạt động theo cùng một cách trong EF 6 và EF Core và có giá trị trong cả hai.

Lưu ý: Chú thích dữ liệu chỉ cung cấp cho bạn một tập hợp con các tùy chọn cấu hình. Fluent API cung cấp một bộ đầy đủ các tùy chọn cấu hình có sẵn trong Code-First.

Chuẩn bị dữ liệu: Tạo dự án MVC, database và gieo mã nguồn Entity Framework

Tạo dự án MVC

Mở Visual Studio, chọn File -> New -> Project, sau đó tạo 1 dự án Console tên là DammioEF, ngôn ngữ C#. Lý do tạo dự án MVC là giúp bạn có thể nhìn thấy kết quả xác nhận dữ liệu trên giao diện Web.

Sau đó, bạn chọn kiểu dự án Web là MVC và nhấn OK để Visual Studio tự động tạo dự án.

Kết nối và tạo database

Bước này bạn có thể tham khảo bài Phần 4: Tạo cơ sở dữ liệu trước [Database First]

Tiếp theo, ở dự án MVC, bạn chọn menu View -> Server Explorer để kết nối với database SQL trên giao diện Visual Studio mà không cần mở SQL Studio Management.

Khi bảng Choose Data Source hiện ra thì bạn chọn Microsoft SQL Server và nhấn Continue để tiếp tục.

Bước này, chọn Data Source là Microsoft SQL Server, nhấn OK để bảng cấu hình Add Connection hiện lên. Kế đến, chọn Server name là [local] và chọn tên database là DammioEF và nhấn OK. Sau đó, Visual Studio dò thấy bạn chưa tạo database này và hỏi có tạo hay không, bạn nhấn Yes.

Sau khi kết nối thành công, bạn sẽ thấy ở khung Server Explorer xuất hiện kết nối mới tới database DammioEF. Bạn chọn chuột phải lên kết nối này và chọn New Query.

Paste đoạn mã này vào tập tin SQLQuery1.sql mới tạo ra và nhấn Excute [Ctrl + Shift + E] để thực thi.

CREATE TABLE [dbo].[Blogs] [ [BlogId] INT IDENTITY [1, 1] NOT NULL, [Name] NVARCHAR [200] NULL, [Url] NVARCHAR [200] NULL, CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED [[BlogId] ASC] ]; CREATE TABLE [dbo].[Posts] [ [PostId] INT IDENTITY [1, 1] NOT NULL, [Title] NVARCHAR [200] NULL, [Date] DATETIME NULL, [ImageURL] NVARCHAR [1000] NULL, [Type] INT NULL, [Content] NTEXT NULL, [BlogId] INT NOT NULL, CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED [[PostId] ASC], CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY [[BlogId]] REFERENCES [dbo].[Blogs] [[BlogId]] ON DELETE CASCADE ];

Gieo mã nguồn

Sau khi tạo database xong, bạn nhấn menu View -> Solution Explorer [hoặc phím tắt Ctrl + Alt + L] để mở cửa sổ Solution Explorer, chọn thư mục Models, chuột phải chọn Add -> New Item để mở cửa sổ Add New Item.

Sau đó, chọn mục Data [tay trái], chọn ADO.NET Entity Data Model và tên của mô hình là Dammio.edmx, cuối cùng nhấn Add.

Bạn chọn mục Generate from Database, nhấn Next, chọn tên kết nối trong App.Config là DammioEFEntities, tiếp tục nhấn Next. Tiếp theo, Visual Studio hỏi về phiên bản EF cần gieo, bạn cứ chọn Entity Framework 6.0 trở lên và nhấn Next.

Ở cửa sổ Entity Data Model Wizard, bạn chọn gieo toàn bộ bảng trong hình và nhấn Finish, vậy là xong.

Bỏ qua một thuộc tính lớp trong Mã thực thể 4.1 Mã đầu tiên?

Trần Ngọc Vy · Trần Ngọc Vy 14:18 30/04/2012

2 ngày trước

Tôi hiểu rằng [NotMapped]thuộc tính này không có sẵn cho đến khi EF 5 hiện đang có trong CTP nên chúng tôi không thể sử dụng nó trong sản xuất.

Làm cách nào để đánh dấu các thuộc tính trong EF 4.1 bị bỏ qua?

CẬP NHẬT: Tôi nhận thấy một cái gì đó lạ. Tôi có [NotMapped]thuộc tính để làm việc nhưng vì một số lý do, EF 4.1 vẫn tạo một cột có tên là Disposed trong cơ sở dữ liệu mặc dù public bool Disposed { get; private set; }nó được đánh dấu bằng [NotMapped]. Lớp học thực hiện IDisposeabletất nhiên nhưng tôi không thấy điều đó quan trọng như thế nào. Có suy nghĩ gì không?

  • c#
  • .net
  • entity framework
  • ef-code-first
  • entity-framework-4.1

281 hữu ích 5 bình luận 177k xem chia sẻ

Thuộc tính DatabaseGenerated trong Entity Framework

Như bạn đã biết, theo mặc định EF tạo một cột IDENTITY trong cơ sở dữ liệu cho tất cả các thuộc tính id [khóa] của thực thể.

Vì vậy, cơ sở dữ liệu sẽ tạo ra một giá trị cho cột này trên mỗi lệnh INSERT. Ví dụ: SQL Server tạo cột IDENTITY số nguyên với identity là 1 và tăng thêm 1 mỗi lần INSERT.

EF 6 cung cấp thuộc tính chú thích dữ liệu được tạo ra cho cơ sở dữ liệu để cấu hình cách tạo ra giá trị của một thuộc tính. Thuộc tính DatabaseGenerated lấy một trong ba giá trị enum của DatabaseGeneratedOption sau đây:

  1. DatabaseGeneratedOption.None
  2. DatabaseGeneratedOption.Identity
  3. DatabaseGeneratedOption.Computing

DatabaseGeneratedOption.None

Tùy chọn DatabaseGeneratedOption.None chỉ định rằng giá trị của thuộc tính sẽ không được tạo bởi cơ sở dữ liệu. Điều này sẽ hữu ích để ghi đè quy ước mặc định cho các thuộc tính id.

Ví dụ: nếu bạn muốn cung cấp các giá trị của riêng mình cho các thuộc tính id thay vì các giá trị được tạo bởi cơ sở dữ liệu, hãy sử dụng tùy chọn None, như được trình bày bên dưới.

public class Course { [DatabaseGenerated[DatabaseGeneratedOption.None]] public int CourseId { get; set; } public string CourseName { get; set; } }

Trong ví dụ trên, EF sẽ tạo cột CourseId trong cơ sở dữ liệu và sẽ không đánh dấu nó là cột IDENTITY. Vì vậy, mỗi lần bạn sẽ phải cung cấp giá trị của thuộc tính CourseId trước khi gọi phương thức SaveChanges.

using [var context = new SchoolContext[]] { // you must provide the unique CourseId value var maths = new Course[]{ CourseId=1, CourseName="Maths"}; context.Courses.Add[maths]; // you must provide the unique CourseId value var eng = new Course[]{ CourseId=2, CourseName="English"}; context.Courses.Add[eng]; // the following will throw an exception as CourseId has duplicate value //var sci = new Course[]{ CourseId=2, CourseName="sci"}; context.SaveChanges[]; }

Lưu ý: EF sẽ đưa ra một ngoại lệ nếu bạn không cung cấp các giá trị duy nhất vì CourseId là thuộc tính khóa chính.

DatabaseGeneratedOption.Identity

Bạn có thể đánh dấu các thuộc tính không phải khóa [không phải id] là thuộc tính do DB tạo giá trị bằng cách sử dụng tùy chọn DatabaseGeneratedOption.Identity.

Điều này xác định rằng giá trị của thuộc tính sẽ được tạo bởi cơ sở dữ liệu trên câu lệnh INSERT. Thuộc tính Identity này không thể được cập nhật.

Xin lưu ý rằng cách giá trị của thuộc tính Identity sẽ được tạo bởi cơ sở dữ liệu tùy thuộc vào nhà cung cấp cơ sở dữ liệu. Nó có thể là identity, rowversion hoặc GUID. SQL Server tạo một cột identity cho một thuộc tính kiểu số nguyên.

public class Course { public int CourseId { get; set; } public string CourseName { get; set; } [DatabaseGenerated[DatabaseGeneratedOption.Identity]] public int RecordNum { get; set; } }

Trong ví dụ trên, thuộc tính RecordNum sẽ là một thuộc tính identity. Điều này có nghĩa là EF sẽ tạo cột IDENTITY trong cơ sở dữ liệu SQL Server cho thuộc tính này.

DatabaseGeneratedOption.Compute

Tùy chọn DatabaseGeneratedOption.Compute chỉ định rằng giá trị của thuộc tính sẽ được tạo bởi cơ sở dữ liệu khi INSERT và sau đó, trên mỗi bản cập nhật tiếp theo.

Giống như Identity, cách cơ sở dữ liệu tạo ra giá trị phụ thuộc vào nhà cung cấp cơ sở dữ liệu. Bạn có thể cấu hình giá trị mặc định hoặc sử dụng một trigger cho cột được tính toán này.

Hãy xem xét ví dụ sau.

public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public DateTime? DateOfBirth { get; set; } public decimal Height { get; set; } public float Weight { get; set; } [DatabaseGenerated[DatabaseGeneratedOption.Computed]] public DateTime CreatedDate { get; set; } }

Trong ví dụ trên, thuộc tính CreatedDate được đánh dấu bằng tùy chọn DatabaseGeneratedOption.Computed. Điều này cho EF biết rằng các giá trị được tạo cho cột này trong cơ sở dữ liệu.

Tuy nhiên, EF không đảm bảo rằng nó sẽ thiết lập cơ chế thực tế để tạo ra các giá trị.

Ở đây, chúng tôi sẽ chỉ định chức năng ngày của SQL Server sẽ tạo giá trị ngày giờ hiện tại trên lệnh INSERT, như được hiển thị bên dưới.

protected override void OnModelCreating[ModelBuilder modelBuilder] { modelBuilder.Entity[] .Property[s => s.CreatedDate] .HasDefaultValueSql["GETDATE[]"]; }

Đoạn mã trên gán giá trị của hàm GETDATE[] của SQL Server làm giá trị mặc định SQL sẽ chèn ngày và giờ hiện tại trên mỗi lệnh INSERT.

Lưu ý: EF không có các cột DatabaseGeneratedOption.Computed trong các câu lệnh INSERT hoặc UPDATE.

Video liên quan

Chủ Đề