2008-10-17 37 views
27

Tôi có cột chuỗi trong bảng cơ sở dữ liệu ánh xạ tới mã Enum trong mã. Trong tệp dbml của tôi khi tôi đặt "Loại" thành MyTypes.EnumType Tôi nhận được lỗi sau:Ánh xạ Enum từ chuỗi

Lỗi 1 DBML1005: Ánh xạ giữa DbType 'VarChar (50) NOT NULL' và nhập 'MyTypes.EnumType' trong cột ' EnumCol 'of Type' Table1 'không được hỗ trợ.

Câu hỏi này: LINQ to SQL strings to enums cho biết những gì tôi đang cố gắng làm là có thể, nhưng làm thế nào nó được thực hiện?

Trả lời

33

Tò mò - nó sẽ hoạt động IIRC; Tôi sẽ xem nếu tôi có thể làm một ví dụ nhanh - tuy nhiên, bạn có thể muốn kiểm tra xem bạn có tên enum đủ điều kiện (tức là bao gồm cả không gian tên).

[cập nhật] Từ here có vẻ như phiên bản RTM được gửi kèm với lỗi khi giải quyết enum. Một giải pháp được đề xuất (trên trang đó) là thêm tiền tố global::. Nó hoạt động tốt cho tôi mà không có cách giải quyết này, vì vậy có thể nó được sửa trong 3.5 SP1? Nó cũng bị cáo buộc hoạt động tốt trong 3.5 nếu bạn sử dụng tên không đủ tiêu chuẩn nếu enum nằm trong cùng một không gian tên.

[ví dụ] Yup, làm việc tốt: với Northwind, tôi xác định một enum cho đất nước vận chuyển:

namespace Foo.Bar 
{ 
    public enum MyEnum 
    { 
     France, 
     Belgium, 
     Brazil, 
     Switzerland 
    } 
} 

sau đó tôi thay đổi nội dung dbml phải có:

<Column Name="ShipCountry" Type="Foo.Bar.MyEnum" DbType="NVarChar(15)" CanBeNull="true" /> 

này được tạo ra:

private Foo.Bar.MyEnum _ShipCountry; 
//... 
[Column(Storage="_ShipCountry", DbType="NVarChar(15)", CanBeNull=true)] 
public Foo.Bar.MyEnum ShipCountry 
{ get {...} set {...} } 

Và cuối cùng đã viết truy vấn:

using (DataClasses1DataContext ctx = new DataClasses1DataContext()) 
{ 
    var qry = from order in ctx.Orders 
       where order.ShipCountry == Foo.Bar.MyEnum.Brazil 
       || order.ShipCountry == Foo.Bar.MyEnum.Belgium 
       select order; 
    foreach (var order in qry.Take(10)) 
    { 
     Console.WriteLine("{0}, {1}", order.OrderID, order.ShipCountry); 
    } 
} 

Làm việc tốt; kết quả:

10250, Brazil 
10252, Belgium 
10253, Brazil 
10256, Brazil 
10261, Brazil 
10287, Brazil 
10290, Brazil 
10291, Brazil 
10292, Brazil 
10299, Brazil 
+0

Nó hoạt động khi tôi nhận được 3,5 SP1 – Barry

+5

Tôi phải thêm "toàn cầu ::" với 3,5 SP1. Có lẽ nó bởi vì tôi đã thay đổi không gian tên mặc định cho DataContext (Project.Dal) và cũng cho các thực thể (Project.Dal.Entities)? – jrummell

17

Tôi biết điều này đã được trả lời, nhưng tôi vẫn gặp lỗi này. Rất kì lạ.

Dù sao, tôi đã tìm thấy giải pháp. Bạn cần phải PREPEND không gian tên đầy đủ của enum với global::

như WTF? Chính xác. Tôi biết nghe có vẻ rất lạ. Dưới đây là một ví dụ screenie =>

alt text http://img11.imageshack.us/img11/7517/lolzqg.png

Vì vậy, què :(

Anyways, tôi không con số này ra. Một số anh chàng gọi Matt, đã làm. Và anh gửi một báo cáo lỗi trên MS Connect và họ không thể repro nó vì vậy nó không cố định, tôi đoán.

Anyways, HTH.

+1

Ghi chú nhanh cho bất kỳ VB nào.Người dùng NET, cú pháp Type phải là "Toàn cầu. <Đủ điều kiện-enum-type>" – Quango

+1

Vì vậy, những gì bạn đang nói là, "đó là một cái bẫy"? –

+1

Tôi thực sự! Chúng tôi phải cung cấp cho những nhà phát triển MS đó nhiều thời gian hơn, tập trung tất cả mã vào Dự án Super Star đó! –

1

Nếu bạn thêm toàn cầu :: qualyfier và nhấn Control + không gian so với gõ vào designer.cs nộp nó nhận ra loại và bạn có thể loại bỏ nó.

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