12

Tôi muốn sử dụng kiểu máy chủ SQL xml làm loại cột cho một lớp thực thể.Loại dữ liệu XML trong EF 4.1 Mã Đầu tiên

Theo this thread nó có thể để ánh xạ một cột như vậy để chuỗi loại:

public class XmlEntity 
{ 
    public int Id { get; set; } 

    [Column(TypeName="xml")] 
    public string XmlValue { get; set; } 
} 

Bảng này được tạo ra một cách chính xác trong datebase theo định nghĩa này. Các đối tượng mới XmlEntity cũng có thể được tạo.

Nhưng sau đó tôi cố gắng để có được một số tổ chức từ cơ sở dữ liệu:

var entity = db.XmlEntities.Where(e => e.Id == 1).FirstOrDefault(); 

Một lỗi xảy ra:

Một hoặc nhiều lỗi xác nhận đã được phát hiện trong thế hệ người mẫu System.Data .Edm.EdmEntityType: EntityType 'XElement' không có khóa được xác định. Xác định khóa cho EntityType này.

Trả lời

18

Vấn đề là với tài sản wrapper của tôi:

[NotMapped] 
public XElement XmlValueWrapper 
{ 
    get { return XElement.Parse(XmlValue); } 
    set { XmlValue = value.ToString(); } 
} 

Tôi không định NotMapped thuộc tính.

+1

Cảm ơn bạn đã chia sẻ! –

+0

@alexey, câu hỏi và câu trả lời tuyệt vời, nhưng câu hỏi sẽ không có ý nghĩa hơn nếu bạn bao gồm thuộc tính XElement trong đó - theo các bài viết MSDN? Hiện tại không có thuộc tính XElement. Vì vậy, không rõ ràng rằng thay đổi duy nhất là thuộc tính [NotMapped]. –

7

Chỉ cần hoàn tất. Đây là tất cả các mã cần thiết, trong một phần.

[Column(TypeName = "xml")] 
public String XmlContent { get; set; } 

[NotMapped] 
public XElement InitializedXmlContent 
{ 
    get { return XElement.Parse(XmlContent); } 
    set { XmlContent = value.ToString(); } 
} 
3

Đây là cách bạn làm điều đó trong dữ liệu chú thích, nếu bạn muốn sử dụng API thạo (và sử dụng một lớp bản đồ) thì:

public partial class XmlEntityMap : EntityTypeConfiguration<XmlEntity> 
{ 
    public FilterMap() 
    { 
     // ... 
     this.Property(c => c.XmlContent).HasColumnType("xml"); 

     this.Ignore(c => c.XmlValueWrapper); 
    } 
} 

Nếu bạn sử dụng API thạo bằng cách ghi đè OnModelCreating trên DbContext sau đó chỉ cần thay đổi những "điều này" với modelBuilder.Entity <XmlEntity>()

Các vấn đề liên quan