11

Tôi cần thêm trường vào mô hình mà Cơ sở dữ liệu không có trường thực sự.Entity Framework 4 (sử dụng EDMX), cách thêm trường vào mô hình mà DB không có trường thực sự

Bởi vì, trước hết tôi đã cố gắng thêm trường này vào lớp Chỉ thực thể.

public partial class Weborder 
{ 
    (Auto Generated) 
    public int orderno {get; set;} 
    . 
    . 
    . 
    (Add Manually) 
    public string newField1 {get; set;} //this is new field that DB does not have 
    public string newField2 {get; set;} //this is new field that DB does not have 
} 

và sau đó, khi tôi cập nhật EDXM thì EDMX xóa trường mới vì cơ sở dữ liệu không có trường. . :(

Vì vậy, tôi thêm lĩnh vực này vào EDMX mô hình bằng tay (Add -> Scalar tuệ)

sau đó một lỗi xảy ra khi biên dịch, thông báo lỗi nói:

Error 1 Error 3004: Problem in mapping fragments starting at line 399:No mapping specified for properties ... 
An Entity with Key (PK) will not round-trip when:... 

Bất kỳ ai biết làm thế nào để thêm các trường mới vào lớp thực thể

Cảm ơn bạn

biên tập cho:?! Nếu mô hình của bạn tôi s đại diện cho cơ sở dữ liệu của bạn và trong cơ sở dữ liệu bạn không có trường, tại sao bạn muốn thêm nó theo cách thủ công?

=>

Khi lấy dữ liệu, kiểu trả về của đối tượng được các lớp thực thể.

và trước khi truyền dữ liệu từ bộ điều khiển để xem, tôi cần thêm nhiều dữ liệu (trường) vào kết quả IQueryable.

cũ)

public DbSet<WEBORDERLN> WEBORDERLNs { get; set; } 

//repository 
public IQueryable<WEBORDERLN> WebOrderLns 
{ 
     get { return context.WEBORDERLNs; } 
} 

và bây giờ tôi lấy dữ liệu weborderln trong bộ điều khiển. và trước khi xem qua, tôi cần phải

thêm dữ liệu bổ sung vào kết quả.

var data = webOrderLnRepository.WebOrderLns.Where(e => e.PICKNO == OrderNo).ToList(); 

foreach (WEBORDERLN weborderln in data) 
{ 
    weborderln.[NEW FIELD] = "EXTRA DATA"; //// FOR THIS, I NEED TO ADD NEW FILED INTO ENTITY CLASS 
} 

//return data 

tôi hy vọng nó có thể giải thích các câu hỏi :)

Cảm ơn một lần nữa.

+0

Nếu mô hình của bạn là đại diện cho cơ sở dữ liệu của bạn và trong cơ sở dữ liệu bạn không có trường, tại sao bạn muốn thêm nó theo cách thủ công? – Dante

+0

@ Dante, Cảm ơn sự quan tâm của bạn. Tôi đã chỉnh sửa lại câu hỏi của mình, vui lòng xem lại câu hỏi của tôi. Và nếu bạn có bất kỳ ý tưởng, xin vui lòng tư vấn cho tôi. –

+0

Về cơ bản, bạn đang mô tả kịch bản cho việc sử dụng ViewModels - tức là. các mô hình được ánh xạ từ các mô hình dữ liệu và bắt nguồn từ khung nhìn cho mục đích truyền dữ liệu đến (và có thể từ) khung nhìn. Bây giờ tôi đã luôn tự hỏi làm thế nào dễ dàng để xây dựng ViewModels trong Entity Framework chính nó (vì tôi có thể muốn sử dụng và truy vấn OData Services, vv) nhưng tôi không biết rằng họ thực sự thuộc về đó. – JayC

Trả lời

14

Bạn phải tạo một phần mới của lớp thực thể (trong tệp .cs mới) và thêm trường mới vào lớp đó. Bạn không được sửa đổi phần được tạo bởi tự động phát vì các tệp tự động phát sẽ bị ghi đè mỗi khi bạn thay đổi tệp EDMX. Bạn cũng không được bao gồm trường trong EDMX vì EDMX định nghĩa ánh xạ của bạn thành cơ sở dữ liệu = nó chỉ chứa các trường trong cơ sở dữ liệu.

Tạo một WebOrderPart.cs file mới trong lắp ráp và namespace giống như các lớp được tạo tự động của bạn có chứa:

public partial class Weborder 
{ 
    public string newField1 {get; set;} 
    public string newField2 {get; set;} 
} 
+0

Cảm ơn bạn đã trả lời! bạn có thể cho tôi một chút gợi ý về "Bạn phải tạo một phần mới của lớp thực thể của bạn (trong tệp .cs mới) và thêm các trường mới vào lớp đó."? –

+0

Kiểm tra câu trả lời cập nhật. –

+0

Tôi tạo một lớp mới cho thực thể và sao chép tất cả các mã ban đầu vào tệp mới (WEBORDERLN2.cs) và cũng sửa đổi đối tượng kiểu trả về bối cảnh và kho lưu trữ thành WEBORDERLN2. nhưng lỗi xảy ra, nó nói "Loại thực thể WEBORDERLN2 không phải là một phần của mô hình cho ngữ cảnh hiện tại." bạn có bất kỳ ý tưởng về điều này? Cảm ơn bạn! –

6

Không hoạt động [NotMapped].

[NotMapped] 
public string newField1 {get; set;} 
3

Trước hết, bạn không nên thay đổi các tập tin mô hình dữ liệu. Tệp này đại diện cho dữ liệu của bạn.

Thứ hai, bạn không nên trả lại đối tượng/bộ sưu tập mô hình dữ liệu của mình từ Kho lưu trữ.Đây là một thực hành rất xấu bởi vì bạn đang tạo ra một sự phụ thuộc giữa Controller/View và Model. Tôi đề nghị bạn tạo các đối tượng Model tùy chỉnh có chứa các thuộc tính bạn cần trong View của bạn, ánh xạ các thực thể của bạn tới các đối tượng Model và chỉ trả về các đối tượng Model hoặc các bộ sưu tập của các đối tượng Model từ Repository của bạn.

+0

Cảm ơn bạn rất nhiều! –

+0

Không cần phải lo lắng;) – Dante