2013-09-28 133 views
5

Tôi làm cách nào để thay đổi quy ước đặt tên của bảng nhiều thành viên được tạo tự động?Làm thế nào để thay đổi quy ước đặt tên của các mối quan hệ bảng nhiều người?

Giả sử tôi có hai lớp:

public class User 
{ 
    public int UserId { get; set; } 
    public virtual List<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public virtual List<User> Users { get; set; } 
} 

By Mặc định, điều này sẽ tạo ra một bảng gọi là UserRoles.

tôi có thể thay đổi tên của các bảng một để UsersInRoles, ví dụ, bằng cách sử dụng sau đây trong override OnModelCreating của DbContext tôi:

modelBuilder.Entity<User>() 
    .HasMany(p => p.Roles) 
    .WithMany(p => p.Users) 
    .Map(mc => 
    { 
     mc.MapLeftKey("UserId"); 
     mc.MapRightKey("RoleId"); 
     mc.ToTable("UsersInRoles"); 
    }); 

Tuy nhiên, những gì tôi thực sự muốn làm thay đổi quy ước đặt tên để theo mặc định, tất cả các bảng nhiều thành viên được tạo tự động sử dụng quy ước mới này. Tôi không thể tìm ra cách để làm điều đó, hoặc nếu nó thậm chí có thể. Tôi không muốn phải chỉ định 9 dòng mã bổ sung mỗi khi tôi chỉ định một trong các mối quan hệ này.

Tôi hiện đang sử dụng phiên bản EF 6.0.0-rc1.

+0

Vì tò mò tại sao bạn thực sự muốn làm điều đó? Mã hóa theo quy ước mất tất cả sự quyến rũ của nó khi bạn tiếp tục có những cái khác nhau. –

+0

Bạn có thể xem [Quy ước tùy chỉnh] (http://msdn.microsoft.com/en-us/data/jj819164.aspx). –

+0

@TonyHopkinson, Trong kịch bản thực tế của tôi, tôi viết một khung làm thay đổi tất cả các tên bảng với một tiền tố dựa trên vị trí "thành phần" của chúng (chẳng hạn như Core, HR, Finance, v.v.). Trong khi tôi có thể viết một bản tóm tắt để đổi tên bảng tiêu chuẩn, nó không hoạt động với các bảng nhiều đến nhiều này, và tôi không thể tìm ra cách. Đối với ví dụ của tôi, tôi đã sử dụng quy ước đó trong một thời gian dài và rất thích gắn bó với nó. –

Trả lời

5

Khả năng kiểm soát các mối quan hệ đã bị xóa khỏi API quy ước cơ bản trước khi phát hành vì không ở trạng thái có thể sử dụng được. Bạn có thể truy cập tất cả các thuộc tính và bảng trong mô hình thông qua các quy ước dựa trên mô hình. Tổng quan về công ước mô hình dựa có sẵn ở đây: http://msdn.microsoft.com/en-US/data/dn469439

Giải pháp này bao gồm nhiều hơn một chút đào bới xung quanh trong API siêu dữ liệu, EntitySet là đúng loại cho kịch bản này

ước này nên đổi tên bảng mối quan hệ được tạo ra:

public class MyConvention : IStoreModelConvention<EntitySet> 
{ 
    public void Apply(EntitySet set, DbModel model) 
    { 
     var properties = set.ElementType.Properties; 
     if (properties.Count == 2) 
     { 
      var relationEnds = new List<string>(); 
      int i = 0; 
      foreach (var metadataProperty in properties) 
      { 
       if (metadataProperty.Name.EndsWith("_ID")) 
       { 
        var name = metadataProperty.Name; 
        relationEnds.Add(name.Substring(0, name.Length - 3)); 
        i++; 
       } 
      } 
      if (relationEnds.Count == 2) 
      { 
       set.Table = relationEnds.ElementAt(0) + "_" + relationEnds.ElementAt(1) + "_RelationTable"; 
      } 
     } 
    } 
+0

Tôi đã chơi với một số, nhưng thấy rằng quy ước EntityType không cho phép tôi đổi tên các bảng. Thuộc tính Set Name là nội bộ. Vì vậy, một lần nữa, tôi đang mắc kẹt với việc phải đổi tên mỗi bảng bằng tay. –

+0

Quy ước trên có giải quyết được vấn đề của bạn hoặc có điều gì khác mà bạn cần không? – lukew

+0

Không, đó là hoàn hảo! Không thể nói rằng tôi gần như là quen thuộc với phần EDM như tôi nên, nhưng điều này là làm việc tuyệt vời. Cảm ơn! –