2013-03-15 20 views
9

Tôi đã đọc về Code First Migrations nhưng có vẻ như điều này không thực sự phù hợp với Enterprise.Có cách nào khác để thay đổi Mã đầu tiên với EF khi tất cả các thay đổi mã được thực hiện bởi một DBA?

Chúng tôi có một DBA thực hiện tất cả các thay đổi Cơ sở dữ liệu của mình và chúng tôi không cần phải có những thay đổi này được đưa vào Lớp học và di chuyển cơ sở dữ liệu do ứng dụng thực hiện.

Nếu chúng tôi thay đổi các lớp học và API thông thạo của chúng tôi và sau đó có DBA của chúng tôi thực hiện thay đổi cho cơ sở dữ liệu thì làm thế nào chúng ta có thể đồng bộ hóa với mô hình EF của chúng tôi? Làm thế nào là điều này thường được thực hiện cho các ứng dụng kích thước doanh nghiệp?

+2

Nếu bạn thay đổi lớp học của bạn để phản ánh những thay đổi trong cơ sở dữ liệu bạn không cần phải di cư. – NunoCarmo

+0

@NunoCarmo - Cảm ơn phản hồi của bạn.Vì vậy, bạn có nói rằng nếu những thay đổi là chính xác 100% thì nó sẽ không phàn nàn về mô hình thay đổi? Điều gì xảy ra nếu có một số khác biệt nhỏ, có cách nào để xem thông báo lỗi hay EF chỉ báo cáo rằng mô hình không còn đồng bộ hóa nữa? –

Trả lời

2

Thông thường trong những trường hợp như vậy, mọi người sử dụng phương pháp Cơ sở dữ liệu thứ nhất.

Viết mã thực thể theo cách thủ công khi ai đó đã thiết kế cơ sở dữ liệu cho bạn và khi bạn có thể tạo hoặc cập nhật mô hình bằng một vài lần nhấp, không có ý nghĩa gì.Tất nhiên, Code First có thể thuận tiện nếu nhóm của bạn quen thuộc với một số ORM khác, đó là cách tiếp cận chính và chưa quen thuộc với Entity Framework, hoặc nếu nhóm của bạn cực kỳ nhỏ và không ai có thể viết kịch bản SQL, nhưng nếu bạn có DBA có kỹ năng, tại sao bạn có thể cần mã đầu tiên?

+5

Nhưng không phải cách tiếp cận Cơ sở dữ liệu đầu tiên tạo tệp edmx? Có cách tiếp cận Cơ sở dữ liệu đầu tiên chỉ sử dụng POCO chuẩn và một trong đó tôi có thể sử dụng API thông thạo không? –

+1

Sẽ không bao giờ có API thông thạo cho cơ sở dữ liệu trước tiên. Cả API thông thạo và tệp edmx đều nhằm mô tả ánh xạ giữa mã và cơ sở dữ liệu, nhưng ngược lại với Fluent API, tệp xml này có thể được tạo bằng thuật sĩ trong Visual Studio, bạn không cần viết bất kỳ thứ gì theo cách thủ công. Đối với các POCO, chúng được hỗ trợ trong phương thức Database First cũng như DbContext. – Oleg

+0

Phương pháp 'DbContext' là gì? Đó là một phần của "Code First"? – mmcrae

5

Mặc dù tôi sử dụng EF Code Kiểu đầu tiên (trái ngược với EDMX), tôi vẫn sử dụng phương pháp tiếp cận cơ sở dữ liệu đầu tiên vì tôi không bao giờ cho phép EF tạo cơ sở dữ liệu cho tôi. Thay vào đó, tôi tạo các lớp để mô hình hóa cơ sở dữ liệu. Điều này nghe giống như những gì bạn cần làm trong trường hợp của bạn.

Đối với những điều thay đổi DBA .. cho dù bạn cần cập nhật các lớp thực thể miền của bạn phụ thuộc vào những gì nó là DBA đang thay đổi. Ví dụ: nếu anh ta tăng chiều dài varchar(100) đến varchar(200) hoặc một cái gì đó tương tự, thì thay đổi đó không thực sự phá vỡ mã của bạn (nhưng bạn vẫn nên cập nhật mã của mình để khớp với mã này). Nếu anh ta loại bỏ hoặc đổi tên một số cột mặc dù, sau đó bạn chắc chắn sẽ cần phải cập nhật các lớp thực thể miền của bạn bởi vì điều đó rõ ràng sẽ gây ra một ngoại lệ liên quan đến mô hình cơ bản không được đồng bộ.

+0

Bạn có tìm thấy bất kỳ thông tin nào hoặc biết EF kiểm tra xem cơ sở dữ liệu và các lớp có được đồng bộ không? Điều gì nếu tôi ví dụ thêm một bảng mới vào cơ sở dữ liệu nhưng điều này không liên quan đến DbContext của tôi. Nó sẽ không gây ra một vấn đề về khởi tạo khi nó xây dựng mô hình và tìm thấy mọi thứ không đồng bộ? –

+1

@Marilou, Thêm bảng mới sẽ không gây ra sự cố. Vấn đề là thay đổi ánh xạ hiện tại. – Matt

+0

@Marilou tại sao đây không phải là câu trả lời được chấp nhận? Câu hỏi của bạn có vẻ như đây là câu trả lời gần nhất. Nếu bạn đang tìm kiếm một cái gì đó tự động liên tục theo dõi POCO bằng tay của bạn với Cơ sở dữ liệu ... thì bạn sẽ không tìm thấy nó bên ngoài việc sử dụng di chuyển mã đầu tiên hoặc edmx. Thật vậy - đó là những thứ bạn sẽ sử dụng, nhưng có vẻ như bạn muốn cái gì khác? – mmcrae

1

Chỉ cần thêm một vài suy nghĩ về vấn đề này - hãy nhìn vào hai bài viết này (tôi đã thực hiện một thời gian trước): https://stackoverflow.com/a/10164815/417747
https://stackoverflow.com/a/10255051/417747

Nói tóm lại, từ kinh nghiệm của tôi:

  • bạn không thể dễ dàng 'duy trì' giải pháp như vậy trong một doanh nghiệp có kích thước thực Db. Sớm hay muộn 'hai thế giới' sẽ va chạm, việc đồng bộ hóa mọi thứ có thể gây đau đớn (mặc dù có thể thực hiện được)
  • tuy nhiên bạn không nên từ bỏ nó vì lý do đó. Tốt cho việc bắt đầu nhảy và lập kế hoạch cẩn thận, đồng bộ hóa bạn có thể thực hiện công việc này một lúc,
  • bạn có thể đổ tập lệnh và/hoặc chỉnh sửa mã di chuyển, điều chỉnh 'gieo' - để loại bỏ một số thay đổi (vẫn còn một số hạn chế là đau khổ và tôi nghi ngờ nó sẽ bao giờ bắt chước 'những gì DBA có thể làm),
  • bạn có thể bỏ qua' thế hệ 'từ CF một khi nó đi quá xa (khá sớm thực sự, ngay sau khi DBA mất hơn) - và chỉ (sử dụng các tập lệnh và được giải thích một phần trong các bài đăng) đảm bảo kết hợp Db-s của bạn (thực tế và 'mã' kế hoạch chi tiết một). Điều đó vẫn có nghĩa là bạn có hầu hết các thiết lập bảng và bạn cần phải chỉnh sửa một số thứ,
  • đây là 'quy tắc ngón tay cái', trong trường hợp tốt của CF sẽ không chính đáng - vì vậy hãy sử dụng nó để tạo mẫu sau đó,
  • cho các trường hợp bạn mô tả một trình tạo 'db' tốt có lẽ là giải pháp tốt hơn (nhưng cũng có một số nhược điểm), nhưng tôi vẫn chưa thấy 'kết hợp' tốt của cả hai thế giới

hy vọng điều này sẽ giúp ích một chút.

2

Một chút trễ trong trả lời, nhưng ở đây đi:

Nếu bạn sử dụng EF Power Tools mở rộng cho Visual Studio, nó mang lại cho bạn khả năng để làm những gì Rowan Miller gọi là "Mã thứ hai". Hãy xem this article.

Nó cho phép bạn trỏ đến một cơ sở dữ liệu hiện có và nó sẽ tạo ra các lớp POCO đẹp và sử dụng DbContext giống như nếu bạn đã thực hiện nó thông qua Code First. Không còn ObjectContext hoặc edmx tệp nữa. Cấu hình thông thạo cũng được tạo hoàn toàn cho bạn.

Tiến lên, nhóm EF sẽ đưa tính năng này vào công cụ EF chính để bạn không phải tải xuống tiện ích mở rộng EF Power Tools.

+0

Nếu bạn muốn nói về các công cụ điện tử lỗi thời của EF (có thể chỉ trong phiên bản beta) và có thể được thêm vào ngay cả VS 2015 ... vẫn còn, đây chỉ là một công cụ và sẽ không khắc phục các vấn đề chính của khung này, mà họ gọi là ORM ... Sử dụng cùng một cường điệu tôi có thể nói "Tôi có 2 ferrari-s trong nhà để xe của tôi". Btw. đã được thêm vào EF và VS chính nó là vượt xa sức mạnh ban đầu của các công cụ điện EF ... – baHI

0

Vài ngày trước, tôi phải đối mặt với cùng một vấn đề,

cơ sở dữ liệu cũ, bảng __MigrationHistory là enter image description here

thực hiện thay đổi trong cơ sở dữ liệu và tái tạo nó ở máy cục bộ enter image description here

thêm ContextKey, Mô hình và ProductVersion từ bảng __MigrationHistory của cơ sở dữ liệu hiện được tạo, tới bảng __MigrationHistory cũ của cơ sở dữ liệu. enter image description here

đừng quên sử dụng tập lệnh thay đổi cho cơ sở dữ liệu cũ. Đối với chỉ hơn kiểm tra,

http://www.codeproject.com/Tips/800936/Entity-Framework-code-first-migrations-alternative

5

Đối với tôi nó không có vẻ như những câu trả lời khác là đủ.

Bạn có thể tắt initializer EF:

public ApplicationContext : DbContext 
{ 
    public ApplicationContext() 
     : base("ConnectionStringName") 
    { 
     Database.SetInitializer<ApplicationContext>(null); 
    } 

    // DbSets here 
    public DbSet<Part> Parts {get; set;} 

    // override OnModelCreating below ... 
} 

Và sau đó sử dụng thạo API chú thích/dữ liệu tuy nhiên bạn thường để thiết lập POCOs của bạn/mô hình để phù hợp với DB hiện có.

chi tiết tại blog này: http://cpratt.co/entity-framework-code-first-with-existing-database/

Trong trường hợp đó URL không hoạt động trong tương lai - đây là những gì tôi muốn nói:

Sau khi thiết lập các Initializer tắt ở trên, cấu hình của poco của bạn tương ứng với một bảng:

public class Part 
{ 
    public string PartID {get; set;} 
    public string Description {get; set;} 
    public decimal Weightlbs {get; set;} 
    public decimal Price {get; set;} 
} 

Sau đó, bản đồ POCO của bạn vào bảng DB hiện bằng cách ghi đè phương pháp này trong lớp Application Context của bạn:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // Code First will assume a lot, but if you need to override things: 

    modelBuilder.Entity<Part>().ToTable("db_PartTable"); 
    modelBuilder.Entity<Part>().Property(p => p.PartID) 
     .HasColumnName("Part_ID"); 
    modelBuilder.Entity<Part>().Property(p => p.Description) 
     .HasMaxLength(100) 
} 

Một blog tốt cho điều này, bởi Scott Guthrie: http://weblogs.asp.net/scottgu/using-ef-code-first-with-an-existing-database

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