2011-01-30 31 views
18

Tôi có một cơ sở dữ liệu và tôi sử dụng 2 lược đồ khác nhau. Các lược đồ giống như các không gian tên (đúng với tôi nếu tôi sai). Bằng cách này tôi có 1 db và 2 lược đồ hiện tại ... vì vậy các bảng trong lược đồ 1 có thể được đặt tên giống như các bảng trong lược đồ khác vì chúng nằm trong các lược đồ riêng biệt.Entity Framework 4: Code First - Tạo db trong lược đồ khác? MapSingleType?

Làm thế nào để tôi nhận được mã EF đầu tiên để nói chuyện với một lược đồ khác và không phải là lược đồ mặc định?

Có liên quan gì đến MapSingleType và ghi đè phương thức hay tôi có thể làm gì khác không?

BẤT K help trợ giúp thực sự được đánh giá cao.

Trả lời

10

Bạn có thể thực hiện quy ước sau:

public class DefaultSchemaConvention : 
      IConfigurationConvention<Type, EntityTypeConfiguration> 
{ 
    string defaultSchema; 
    public DefaultSchemaConvention(string defaultSchema) 
    { 
     if (String.IsNullOrWhiteSpace(defaultSchema)) 
      throw new ArgumentException("defaultSchema"); 
     this.defaultSchema = defaultSchema; 
    } 

    void IConfigurationConvention<Type, EntityTypeConfiguration>.Apply(
     Type memberInfo, Func<EntityTypeConfiguration> configuration) 
    { 
     EntityTypeConfiguration cfg = configuration(); 
     string tableName = cfg.EntitySetName; 
     if (String.IsNullOrEmpty(tableName)) 
      tableName = memberInfo.Name; 
     cfg.ToTable(tableName, this.defaultSchema); 
    } 
} 

Cách sử dụng:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.Edm.Db.ColumnTypeCasingConvention>(); 
    modelBuilder.Conventions.Add(new DefaultSchemaConvention("TEST")); 
} 

Có một vài ghi chú bên Arthur Vickers here về TPT thừa kế và nhiều-nhiều mối quan hệ.

+1

Cảm ơn bạn đã giúp đỡ của bạn. – Martin

+4

Đáng buồn là nó không còn hoạt động nữa, trông giống như EF 4.1 đã xóa 'IConfigurationConvention'. – Omar

+0

Bây giờ bạn có thể ghi đè OnModelCreating trong DbContext của bạn và ánh xạ một thực thể vào một bảng bằng cách sử dụng modelBuilder.Entity (). ToTable ("MyTableName", "MySchemaName"); – hnafar

1

Dưới đây là ví dụ về cách tạo khuôn khổ thực thể sử dụng lược đồ bảng dựa trên (các) không gian tên của mô hình của bạn. Ví dụ nếu bạn có một mô hình RiaLib.Data.Models.Membership.User thì bảng db tương ứng sẽ được gọi là [Thành viên]. [Người dùng] thay vì [dbo]. [Người dùng].

public class DatabaseContext : DbContext 
{ 
    public DbSet<Membership.User> Users { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Add(new TableSchemaConvention()); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

https://github.com/rialib/efextensions>TableSchemaConvention.cs

7

Tôi không biết về mô hình CodeFirst, nhưng DataAnnotation cho "Bảng" bao gồm một lựa chọn giản đồ. Mã của tôi đọc như thế này:

<Table("Product", Schema:="SalesLT")> 
Public Class Product 

End Class 

này đã giúp tôi đối phó với schemas thay thế

+0

không có vẻ như không còn nữa. Tôi ước nó đã làm. – Kahanu

+0

Cảm ơn! Làm việc cho EF 5.0. –

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