2012-03-26 67 views
10

Tôi đang cố gắng thực hiện hướng dẫn này http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs nhưng thay vì sử dụng ấn bản nhỏ gọn của SQL Server, tôi đang sử dụng cài đặt đầy đủ trên máy cục bộ của mình. Cách tôi đọc hướng dẫn này là khung Entity giả sử để tạo các bảng từ các đối tượng mà tôi đã định nghĩa. Vấn đề của tôi là tôi tiếp tục nhận được tên đối tượng dbo.movies không hợp lệ, khi tôi chạy dự án. Cuối cùng tôi đã có nó để chạy bằng cách tạo ra bảng bản thân mình vì vậy tôi biết chuỗi kết nối và tất cả mọi thứ là chính xác.Tự động tạo các bảng cơ sở dữ liệu từ các đối tượng, khung thực thể

Câu hỏi của tôi là, có thể tạo bảng từ các đối tượng được tạo trong C# và nếu có thì làm cách nào?

Trả lời

19

có thể tạo bảng từ các đối tượng được tạo trong C# không?

Có thể thực hiện được. Bạn có tạo cơ sở dữ liệu theo cách thủ công trong Management Studio trước khi chạy Mã không? Đó có thể là vấn đề của bạn. Với Code First, quy ước mặc định là tạo cơ sở dữ liệu nếu nó chưa tồn tại. Nếu cơ sở dữ liệu đã tồn tại (ngay cả khi không có các bảng) thì nó sẽ chỉ sử dụng cơ sở dữ liệu hiện có (nhưng nó sẽ không cố gắng và tạo ra các bảng).

Bạn có thể xóa các cơ sở dữ liệu và thử và chạy mã một lần nữa để xem nếu nó sẽ tạo ra điều đó cho bạn hoặc đặt dòng sau trong Global.asax:

Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContextHere>()); 

Một khi nó đã chạy sau đó tôi sẽ đề nghị thay đổi dòng để:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContextHere>()); 

Những không gian tên được định nghĩa trong System.Data.Entity

lớp DbContext này cũng tiết lộ dữ liệu tài sản cơ sở đó xác định phương pháp hữu ích sau đây:

Delete() 
Create() 
CreateIfNotExists() 

Vì vậy, nếu bạn đã định nghĩa lớp học của bạn như sau:

public class MyContext : DbContext {} 

Bạn có thể xây dựng một ví dụ như vậy:

MyContext db = new MyContext(); 
db.Database.Delete(); 
db.Database.Create(); 
+0

Hmm, tôi giả sử gì để đưa vào chuỗi kết nối nếu không có cơ sở dữ liệu ban đầu để kết nối? Tôi chỉ xóa mảnh danh mục ban đầu khỏi nó và nhận được cùng một tên đối tượng không hợp lệ 'dbo.Movies'. – Pieces

+0

Chuỗi kết nối cho biết nơi tạo cơ sở dữ liệu. Nó không phải tồn tại. Nó sẽ phát hiện ra rằng nó không tồn tại và sau đó cố gắng tạo ra nó nếu nó không tồn tại. Miễn là nó có quyền chính xác, mọi thứ sẽ được tạo ra tốt. Tôi nghĩ rằng nếu bạn xóa cơ sở dữ liệu và giữ cùng một chuỗi kết nối thì mọi thứ sẽ kết thúc theo cách bạn muốn. – Dismissile

+0

Ồ, cảm ơn bạn rất nhiều! Một câu hỏi cuối cùng mà phương pháp bạn sẽ khuyên bạn nên đặt Database.SetInitializer in Tôi đã nhận một lỗi mà nó không thể thả cơ sở dữ liệu vì nó đã được sử dụng. Tôi sẽ đoán trước bằng việc tự ứng dụng nó. Cảm ơn một lần nữa, bạn tôi và tôi dành rất nhiều thời gian tìm kiếm để tìm ra vấn đề và sẽ không bao giờ đoán rằng đó là cơ sở dữ liệu không nên được tạo ra. – Pieces

0

Nếu bạn tạo một DataContext của LINQ-to-Sql, bạn có thể tiêm trực tiếp cấu trúc đó vào cơ sở dữ liệu của bạn:

DbDataContext db = new DbDataContext(connectionString); 
db.CreateDatabase(); 
+1

Anh ấy đang sử dụng Entity Framework DbContext, không phải LINQ-to-SQL – Dismissile

0

Tôi không biết nếu điều này là kosher, nhưng bằng cách sử dụng mã đầu tiên EF, khi tôi sử dụng AddRange, EF thường sẽ tạo tất cả các bảng tôi đã xác định. Tôi muốn giữ cơ sở dữ liệu vì có các bảng khác mà tôi muốn giữ giữa các lần chạy ứng dụng. Tôi phát hiện ra rằng các bảng sẽ không được tái tạo sau khi chúng bị xóa nếu tôi cũng không xóa bảng EF được tạo ra có tên là __MigrationHistory.

Khi tôi đã xóa bảng này, thì EF sẽ tạo lại các bảng mà không phải tạo lại cơ sở dữ liệu.

Đây có thể không phải là phương pháp được khuyến nghị trong sản xuất, nhưng đối với nhu cầu phát triển của tôi, điều này đã giải quyết được vấn đề của tôi. Có lẽ nó sẽ giúp người khác.

0

Bạn có thể sử dụng thư viện FenixRepo (cũng có sẵn dưới dạng nuget package) để tạo bảng cụ thể, đó là một phần của bạn Context.Trước hết, bạn nên gọi một lần, khi khởi động phương thức staticInitialize, trong đó đối số đầu tiên là phương thức nhà máy, trả về phiên bản Context và phương thức thứ hai là ví dụ Configurationclass. Nó sẽ chuẩn bị các tập lệnh SQL cho tất cả các bảng của bạn, được đăng ký tại số Context của bạn. Ở trường hợp của ASP.NET MVC nó là một quyết định đúng đắn để dán mã này vào Global.asax:

FenixRepositoryScriptExtractor.Initialize(() => new Context(), new Configuration()); 

Sau đó, bạn có thể tạo bảng mong muốn loại MyTable cách đơn giản này:

var repo = new FenixRepositoryCreateTable<MyTable>(); 
//or repo = new FenixRepository<MyTable>(); 

repo.CreateTable(); 

Ngoài ra, nếu bảng của bạn trải rộng giữa một số di chuyển và chúng không có gì tương ứng với các bảng khác, bạn có thể chỉ định những di chuyển này (tức là tên của các lớp từ thư mục Migration) qua FenixAttribute và chính xác chúng sẽ được sử dụng làm nguồn của tập lệnh SQL. để tạo bảng:

[Fenix(nameof(Initial), nameof(MyTableFirstMigration), nameof(MyTableSecondMigration))] 
public class MyTable 
{ 
    //some stuff 
} 

Nếu không có thuộc tính này, thư viện sẽ sử dụng mặc định tập lệnh. Tốt hơn hết là chỉ định di chuyển, vì nếu không, sẽ không đảm bảo rằng tất cả các chỉ mục sẽ được tạo và cũng có thể bao gồm một số mã tùy chỉnh, sẽ không được thực hiện trong trường hợp giải pháp mặc định.

Thư viện tương thích và được kiểm tra với EF 6.1.3 trong trường hợp MS SQL.

-1
ModelContext.Database.EnsureCreated(); 
+0

xin giải thích câu hỏi của bạn. –

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