2012-03-09 20 views
9

Đoạn mã sau ném ngoại lệ "EntitySqlException: 'Nhóm' là từ khóa dành riêng và không thể được sử dụng làm bí danh, trừ khi nó được thoát. Gần dòng 1, cột 11".Làm cách nào để sử dụng từ khóa được đặt trước sql trong tên của thuộc tính trong ngữ cảnh dữ liệu khung thực thể?

Câu hỏi của tôi trước hết là tại sao có bất kỳ mối quan hệ nào giữa tên bộ sưu tập mà tôi chọn trên ngữ cảnh dữ liệu của mình và, dường như truy vấn sql được tạo ra?

Và thứ hai, tôi có thể làm bất cứ điều gì, ngoài việc đổi tên tài sản trong bối cảnh của tôi, để giải quyết nó (tôi biết tên là ngu ngốc, có lý do tại sao tôi không thể thay đổi tên, nhiều như tôi muốn, rằng tôi sẽ không đi vào đây)?

Tôi có thể làm gì với modelBuilder?

public class GroupEntity 
{ 
    public int GroupEntityId { get; set; } 
    public string Name { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public MyContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
     Group = Set<GroupEntity>(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<GroupEntity>().ToTable("GroupEntities"); 
     base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<GroupEntity> Group { get; private set; } 
} 

//... 
using (var ctx = new MyContext("valid connection string")) 
{ 
    var e = ctx.Group.Count(a => a.GroupEntityId % 2 == 0); 
    // Exception thrown here 
    Console.WriteLine(e); 
} 
+2

Bạn đã nhận ra rằng tên đó là ngu ngốc, vì vậy +1 ở đó :) Nhóm là cả cụm từ chung chung (thay vì liên quan đến dữ liệu mà nó nắm giữ) và một từ dành riêng cho LINQ. Bạn đã thử đầy đủ 'var e = FROM a trong ctx.Group' LINQ cú pháp thay vì để xem nếu nó lẻn qua? Nếu bạn * có thể * giải thích tại sao bạn không thể đổi tên nó có thể giúp ích? –

+0

Cảm ơn, vâng, lý do tại sao tôi không thể thay đổi tên không phải là kỹ thuật vì vậy tôi không nghĩ rằng họ sẽ giúp đỡ ở đây. Ngẫu nhiên, có những thứ khác tôi có thể gọi nó là kết quả trong cùng một ngoại lệ, ví dụ "Sử dụng, Như, Chọn" vì vậy tôi chỉ muốn biết nếu có thể không đổi tên thuộc tính trước khi tôi sử dụng thực tế nó không phải là lý do để thay đổi nó (cùng với các lý do khác mà bạn đã đề cập), nếu bạn thấy ý tôi là :-) – kmp

+0

Để lặp lại: Bạn đã thử cú pháp LINQ đầy đủ 'var e = FROM a in ctx.Group' thay vào đó để xem liệu nó có lén lút qua không? Về lý thuyết nó tạo ra cùng một IL dưới mui xe, nhưng giá trị một thử nhanh chóng. –

Trả lời

1

Điều này được khắc phục trong EF 4.3.1 và EF 5.0 beta1. Vui lòng sử dụng NuGet để cập nhật gói EntityFramework lên phiên bản mới nhất. Ví dụ: trong Bảng điều khiển Trình quản lý Gói, hãy chạy:

Update-Package EntityFramework 
+0

Cảm ơn rất nhiều! Tôi cập nhật lên 4.3.1 (tôi đã ở 4.3) và nó hoạt động tốt. – kmp

0

Bạn luôn có thể làm cho số nhiều, như Nhóm để biến nó thành từ "không được bảo lưu".

+0

cảm ơn, vâng, câu hỏi của tôi là làm thế nào tôi có thể đi xung quanh nó mà không thay đổi tên của tài sản và tôi nghĩ câu trả lời thực sự là "bạn không thể - đó là lỗi trong khung thực thể" – kmp

1

Vì vậy, sau một thời gian nhìn vào điều này tôi đã kết luận rằng câu trả lời cho câu hỏi của tôi là nó là không thể. Đây không phải là một thỏa thuận lớn, vì tôi có thể đổi tên tài sản, nhưng tôi nghĩ rằng nó là cái gì đó nên "chỉ làm việc" và vì vậy tôi nêu ra một vấn đề kết nối MS cho nó có thể được tìm thấy ở đây: Using a sql reserved keyword as the name of a collection on a DbContext causes an exception. Nếu điều này được giải quyết hoặc bị từ chối bởi vì nó thực sự có thể tôi sẽ cập nhật câu trả lời này.