Mô hình sao lưu bối cảnh <Database> đã thay đổi kể từ khi cơ sở dữ liệu được tạo


253

Thông báo lỗi:

"Mô hình sao lưu bối cảnh 'Sổ địa chỉ' đã thay đổi kể từ khi cơ sở dữ liệu được tạo. Hoặc xóa / cập nhật cơ sở dữ liệu theo cách thủ công hoặc gọi Database.SetInitializer với một ví dụ IDatabaseInitializer. tùy chọn gieo nó với dữ liệu mới. "

Tôi đang cố gắng sử dụng tính năng mã đầu tiên và sau đây là những gì tôi đã viết:

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

Lớp ngữ cảnh:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

và chuỗi kết nối:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

Vì vậy, tên cơ sở dữ liệu là "Sổ địa chỉ" và lỗi xảy ra khi tôi cố gắng thêm đối tượng liên hệ vào ngữ cảnh. Tôi có thiếu thứ gì ở đây không?



Xóa bảng __MigrationHistory khỏi cơ sở dữ liệu của bạn
Zahid Hasan

Câu trả lời:


397

Bây giơ là:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

trong tệp YourDbContext.cs của bạn.


Tôi đã thay đổi db sản xuất của mình theo cách thủ công và tắt di chuyển và nó hoạt động, Cảm ơn
Mohsen Afshin

13
Ps, điều này diễn ra trong Global.asax Application_Start ()
BritishDeveloper

48
Tốt hơn Global.asax là đưa cái này vào hàm tạo của lớp DbContext của bạn. Bằng cách đó, nó hoạt động cho mọi trang web sử dụng bối cảnh thay vì chỉ một trang web được kiểm soát bởi tệp Global.asax.
Corin

7
Có lẽ tốt nhất là đặt nó trong bộ điều khiển tĩnh của lớp ngữ cảnh để nó chỉ được gọi một lần - như trong video ví dụ này: msdn.microsoft.com/en-us/data/jj572367
Christian Fredh

3
Nó nên được đặt bên trong khoảng trống ghi đè được bảo vệ OnModelCreating (DbModelBuilder modelBuilder) {Database.SetInitializer <YourDbContext> (null); cơ sở.OnModelCreating (modelBuilder); }
Chris Voon

135

Dưới đây là một số thông tin từ Blog của Scott Gu được đăng bởi Jeff về những gì thực sự diễn ra:

Đối với những người đang nhìn thấy ngoại lệ này:

"Mô hình sao lưu bối cảnh 'Sản xuất' đã thay đổi kể từ khi cơ sở dữ liệu được tạo. Hoặc xóa / cập nhật thủ công cơ sở dữ liệu hoặc gọi Database.SetInitializerbằng một IDatabaseInitializerví dụ."

Đây là những gì đang xảy ra và phải làm gì về nó:

Khi một mô hình được tạo lần đầu tiên, chúng tôi chạy DatabaseInitializer để thực hiện những việc như tạo cơ sở dữ liệu nếu nó không ở đó hoặc thêm dữ liệu hạt giống. DatabaseInitializer mặc định cố gắng so sánh lược đồ cơ sở dữ liệu cần thiết để sử dụng mô hình với hàm băm của lược đồ được lưu trữ trong bảng EdmMetadata được tạo với cơ sở dữ liệu (khi Code First là người tạo cơ sở dữ liệu). Các cơ sở dữ liệu hiện tại sẽ không có bảng EdmMetadata và do đó sẽ không có hash hash và việc triển khai hôm nay sẽ bị ném nếu bảng đó bị thiếu. Chúng tôi sẽ thay đổi hành vi này trước khi chúng tôi gửi phiên bản fial vì đây là mặc định. Cho đến lúc đó, các cơ sở dữ liệu hiện tại thường không cần bất kỳ trình khởi tạo cơ sở dữ liệu nào để có thể tắt nó cho loại ngữ cảnh của bạn bằng cách gọi:

Database.SetInitializer<YourDbContext>(null);

Jeff


9
Tôi đã thử điều này ngày hôm nay và tôi không còn nhận được "Mô hình đã thay đổi", thay vào đó tôi nhận được "Tên đối tượng không hợp lệ 'dbo.Table'"
Stefan Bergfeldt

3
Jeff muốn đây là một cách giải quyết nhưng đã hơn hai năm kể từ đó và SetInitializer thành null vẫn được yêu cầu. đúng? Vì vậy, ai đó có thể vui lòng giải thích làm thế nào điều này phù hợp với quy trình di chuyển.
kroiz

2
@jakejgordon: Tôi cũng vậy với EF6 nhưng nếu nó ở Global.asax, nó chỉ khắc phục vấn đề khi chạy trang web. Nếu bạn có bài kiểm tra đơn vị, bạn là OOL. Tốt hơn là đặt nó trong hàm tạo của YourDbContext. Điều đó sửa nó cho mọi dự án, bao gồm cả trang web và các dự án thử nghiệm.
Rap

1
IMO, câu trả lời này nên được ghi điểm cao hơn vì nó thực sự giải thích lý do tại sao chúng ta cần thêm dòng mã này. Cảm ơn bạn.
Paul

1
@StefanBergfeldt nếu bạn hoặc bất kỳ ai nhận được Invalid object name 'dbo.Tablekiểm tra chuỗi kết nối của bạn Đính kèm tên và danh mục ban đầu
benscabbia

41

Đối với khung thực thể 5.0.0.0 - 6.1.3

Bạn DO thực sự muốn làm những điều sau đây:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

Vâng, Matt Frear là chính xác. CẬP NHẬT -EDIT: Hãy cẩn thận là tôi đồng ý với những người khác thay vì thêm mã này vào global.asax được thêm vào lớp DbContext của bạn

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

Như những người khác đề cập, điều này cũng tốt cho việc xử lý thử nghiệm đơn vị.

Hiện tại tôi đang sử dụng cái này với Entity Framework 6.1.3 /.net 4.6.1

Tôi sẽ quay lại để cung cấp một đoạn CORE trong tương lai gần.


1
Cảm ơn bạn! Program.cs chắc chắn hoạt động cho bảng điều khiển.
HockeyJ

Nhưng khi bạn lần đầu tiên khởi tạo cơ sở dữ liệu của mình thì nó sẽ không tạo cơ sở dữ liệu nếu tôi đặt setinitializer null tại phương thức onModelCreating. Có suy nghĩ gì không? Eventhoug tôi sử dụng (var bối cảnh = Activator.CreateInstance <TContext> ()) {bối cảnh.Database.Initialize (true); }
Rupesh Kumar Tiwari

Tôi cần tìm mã của mình mà tôi sẽ sử dụng mà đôi khi tôi sẽ bình luận một dòng và trao đổi ... Tôi không nhớ lại vấn đề, tôi cần xem xét.
Tom Stickel

1
Giải pháp tốt nhất. Nó khiến cho giải pháp của tôi chạy và tôi không biết phân nhánh là gì. Cam kết và triển khai.
Svend

32

Chỉ cần chạy lệnh followng sql trong SQL Server Management Studio:

delete FROM [dbo].[__MigrationHistory]

1
Bạn đã cứu cuộc đời tôi! Cảm ơn bạn.
Marek Dorda

31

Khắc phục sự cố này không còn hoạt động sau CTP5.

Bạn phải làm Database.SetInitializer<YourContext>(null);


1
Nó đi đâu ... OnModelCreating không có gì có thể truy cập được gọi là DbDatabase
James

Ở đâu đó trong quá trình khởi động, tôi đặt của tôi trong Application_Start.
chrisortman

Database.SetInitializer dường như hoạt động tốt trong bản phát hành cuối cùng của EF 4.3.
Richard Beier

Tôi cho rằng "Bản sửa lỗi này không còn hoạt động sau CTP5" có nghĩa là câu trả lời được chấp nhận từ ngày 30 tháng 8 năm 2010 là những gì anh ấy đang nói.
Tom Stickel

19

Chỉ cần tìm ra câu trả lời và nghĩ đến việc cập nhật ở đây. Chỉ cần làm như sau.

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}

12
Điều này không còn có thể với các phiên bản sau của EF, cũng modelBuilder.Conventions.Remove<IncludeMetadataConvention>();không giúp ích gì cho tình hình. DbDatabase.SetInitialzer (null); làm việc.
JTew

@TomStickel - Tôi đồng ý. Đã đánh dấu stackoverflow.com/a/6143116/255562 làm câu trả lời.
Ashish Gupta

16

Hoặc bạn có thể đặt dòng này trong tệp Global.asax.cs trong Application_Start ():

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

Đảm bảo thay đổi ProjectName.Path.Context thành không gian tên và ngữ cảnh của bạn. Nếu sử dụng mã trước tiên, điều này sẽ xóa và tạo cơ sở dữ liệu mới bất cứ khi nào có bất kỳ thay đổi nào được thực hiện đối với lược đồ.


Chính xác những gì tôi cần, vì tôi chỉ làm nguyên mẫu. Cảm ơn rất nhiều.
Học viên

8

Tôi đã dành nhiều ngày để giải quyết vấn đề này, phân tích nhiều bài viết khác nhau và thử nhiều lựa chọn và cuối cùng đã sửa. 2 dự án này trong giải pháp của tôi sử dụng mã di chuyển đầu tiên của mã EF:

  • Ứng dụng Bảng điều khiển "DataModel", chủ yếu sử dụng như tập hợp có chứa tất cả các thực thể mã đầu tiên của tôi, DbContext, Mirgations và kho lưu trữ chung. Tôi đã đưa vào dự án này tệp riêng biệt của cơ sở dữ liệu cục bộ (trong thư mục DataModel / App_Data) để có thể tạo di chuyển từ Bảng điều khiển quản lý gói.
  • WebApi, tham chiếu đến dự án DataModel và sử dụng tệp cơ sở dữ liệu cục bộ từ thư mục WebApi / App_Data, không có trong dự án

Tôi đã gặp lỗi này khi yêu cầu WebApi ...

Môi trường của tôi:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional với Bản cập nhật 1
  • tất cả các dự án của tôi nhắm mục tiêu cho .NET Framework 4.6.1
  • EntityFramework 6.1.3 từ NuGet

Ở đây tôi đã thu thập tất cả các lưu ý bạn nên chú ý và tất cả các điều kiện / yêu cầu phải được đáp ứng, để tránh ngoại lệ được đề cập:

  1. Bạn chỉ nên sử dụng một phiên bản gói Nuget EntityFramework cho tất cả các dự án trong giải pháp của mình.
  2. Cơ sở dữ liệu, được tạo bằng cách chạy tuần tự tất cả các tập lệnh di chuyển phải có cùng cấu trúc / lược đồ như bạn nhắm mục tiêu cơ sở dữ liệu và tương ứng với mô hình thực thể. Sau 3 điều phải chính xác tương ứng / phản ánh / khớp với nhau:
    • Tất cả các tập lệnh di chuyển của bạn đến cuối cùng
    • Mã hiện tại trạng thái mô hình thực thể đầu tiên (DbContext, thực thể)
    • Cơ sở dữ liệu đích
  3. Cơ sở dữ liệu đích (tệp mdf) phải được cập nhật / tương ứng với tập lệnh di chuyển cuối cùng. Xác minh rằng bảng "__MigrationHistory" trong cơ sở dữ liệu đích của bạn chứa các bản ghi cho tất cả các tập lệnh di chuyển mà bạn có, điều đó có nghĩa là tất cả các tập lệnh di chuyển đã được áp dụng thành công vào cơ sở dữ liệu đó. Tôi khuyên bạn nên sử dụng Visual Studio để tạo mã chính xác cho các thực thể và bối cảnh đầu tiên tương ứng với cơ sở dữ liệu của bạn, Project -> Thêm mục mới -> Mô hình dữ liệu thực thể ADO.NET -> Mã đầu tiên từ cơ sở dữ liệu: Tất nhiên, như một cách thay thế, nếu bạn không có cơ sở dữ liệu, bạn có thể viết mô hình thủ công (mã thực thể và ngữ cảnh đầu tiên) và sau đó tạo cơ sở dữ liệu và di chuyển ban đầu.
  4. Tên của chuỗi kết nối, ví dụ MyConnectionString trong tệp cấu hình của dự án khởi động (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>

    phải bằng với tham số được truyền trong hàm tạo của DbContext của bạn:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. Trước khi sử dụng Bảng điều khiển quản lý gói , hãy đảm bảo rằng bạn đang sử dụng cơ sở dữ liệu chính xác để cập nhật hoặc tạo di chuyển và dự án cần thiết được đặt làm dự án khởi động của giải pháp. Để kết nối với cơ sở dữ liệu, nó sẽ sử dụng chuỗi kết nối từ tệp .config, trong dự án, được đặt làm dự án khởi động.
  6. Và chính, đã khắc phục vấn đề của tôi: Thật kỳ lạ, nhưng trong thư mục WebApi / bin của tôi, DataModel.exe đã cũ, không được làm mới kể từ lần xây dựng trước. Vì việc di chuyển đã được nhúng trong tập hợp DataModel.exe của tôi, sau đó cơ sở dữ liệu WebApi của tôi được cập nhật bằng các phép màu cũ. Tôi đã nhầm lẫn tại sao sau khi cập nhật cơ sở dữ liệu trong WebApi, nó không tương ứng với tập lệnh di chuyển mới nhất từ ​​DataModel. Mã sau tự động tạo (nếu không tồn tại) hoặc cập nhật cơ sở dữ liệu di chuyển cục bộ mới nhất trong thư mục WebApi / App_Data của tôi.

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...

    Tôi đã thử làm sạch và xây dựng lại giải pháp nhưng không được, vì tôi đã loại bỏ hoàn toàn các thư mục bin và obj khỏi WebApi, xóa các tệp cơ sở dữ liệu khỏi WebApi / App_Data, xây dựng, khởi động lại WebApi, yêu cầu nó, nó tạo ra cơ sở dữ liệu chính xác - khởi tạo lười biếng (sử dụng các dòng trên), tương ứng với di chuyển mới nhất và ngoại lệ không xuất hiện nhiều hơn. Vì vậy, điều này có thể khắc phục vấn đề của bạn:

    1. xóa thủ công bin, thư mục obj khỏi dự án khởi động của bạn (tạo / cập nhật cơ sở dữ liệu của bạn)
    2. xây dựng dự án khởi nghiệp của bạn hoặc tốt hơn là làm sạch và xây dựng lại tất cả các giải pháp của bạn.
    3. tạo lại cơ sở dữ liệu bằng cách bắt đầu dự án (sẽ thực thi các dòng ở trên) hoặc sử dụng lệnh "update-database" Console Manager Console.
    4. kiểm tra thủ công xem db và __MirgationHistory được tạo có tương ứng với tập lệnh di chuyển mới nhất hay không.

5

Đối với tôi, với việc nâng cấp lên 4.3.1, tôi chỉ cần cắt bớt bảng EdmMetaData hoặc chỉ xóa nó hoàn toàn.


Tôi đã cập nhật lên 4.3.1 và sau đó đổi tên bảng EdmMaetaData. Bây giờ tôi có thể thay đổi mô hình khi cần thiết và không còn thông báo lỗi khó chịu nào về việc sao lưu mô hình blah blah.
Ashok Padmanabhan

3

Dành cho nhà phát triển VB.NET:

Thêm dòng sau vào tệp Glabal.asax.vb, ở cuối phương thức Application_Start ()

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

Thay đổi ApplicationDbContext thành bối cảnh Db cụ thể của bạn.


2

Tôi đã có vấn đề này và hóa ra một dự án đang chỉ vào SQLE Express nhưng dự án có vấn đề đang chỉ vào LocalDb. (trong web.config tương ứng của họ). Giám sát ngớ ngẩn nhưng đáng chú ý ở đây trong trường hợp bất cứ ai khác đang khắc phục sự cố này.


2

Điều đó có nghĩa là có một số thay đổi về bối cảnh chưa được thực hiện. Vui lòng chạy Thêm di chuyển trước để tạo các thay đổi mà chúng tôi đã thực hiện (những thay đổi mà chúng tôi có thể không biết) Và sau đó chạy Cập nhật cơ sở dữ liệu


2

Tôi có cùng một vấn đề - thêm lại việc di chuyển và cập nhật cơ sở dữ liệu không hoạt động và không có câu trả lời nào ở trên có vẻ đúng. Sau đó, cảm hứng đánh vào tôi - Tôi đang sử dụng nhiều tầng (một web, một dữ liệu và một doanh nghiệp). Lớp dữ liệu có bối cảnh và tất cả các mô hình. Lớp web không bao giờ ném ngoại lệ này - đó là lớp nghiệp vụ (mà tôi đặt làm ứng dụng bảng điều khiển để thử nghiệm và gỡ lỗi). Hóa ra lớp nghiệp vụ không sử dụng đúng chuỗi kết nối để lấy db và tạo bối cảnh. Vì vậy, tôi đã thêm chuỗi kết nối vào cấu hình ứng dụng của lớp nghiệp vụ (và lớp dữ liệu) và viola nó hoạt động. Đặt điều này ở đây cho những người khác có thể gặp phải vấn đề tương tự.


1

Tôi sử dụng phương thức Database.CompiverseWithModel (có sẵn trong EF5) để kiểm tra xem mô hình và DB có khớp với nhau không trước khi tôi sử dụng nó. Tôi gọi phương thức này ngay sau khi tạo bối cảnh ...

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }

1

Đề nghị tốt, tuy nhiên, nt rất chính xác trong mọi trường hợp. Tôi tìm ra một. Vui lòng bạn cần đảm bảo rằng bạn chạy "kích hoạt di chuyển" bằng cửa sổ PM trong Visual Studio và thư mục Di chuyển sẽ được thêm vào dự án của bạn.

Đảm bảo hai tệp lớp c # được thêm vào thư mục trên sẽ chứa tất cả các mô hình của bạn và các thuộc tính tương ứng của chúng.

Nếu bạn có tất cả những gì xây dựng giải pháp và publis để triển khai.

Logic là siêu dữ liệu hiện tại không thể được ghi đè vì ứng dụng của bạn không có siêu dữ liệu để thay thế hiện tại. Kết quả là bạn đang gặp phải lỗi này "Mô hình sao lưu bối cảnh đã thay đổi kể từ khi cơ sở dữ liệu được tạo"


1

Chỉ trong trường hợp ai đó có cùng kịch bản như của tôi.

Tôi có cơ sở dữ liệu đầu tiên EF và đồng thời sử dụng danh tính asp.net

vì vậy tôi có hai ConnectionStrings trong webconfig của mình và không có vấn đề gì với điều đó. Nó đã xảy ra rằng tôi đã tạo / chạy các tập lệnh để tạo thủ công các bảng nhận dạng asp.net mà tôi không nên.

vì vậy, DROP trước tiên tất cả các bảng nhận dạng asp.net do bạn tạo bằng tay / từ các tập lệnh.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers

1

Không có giải pháp nào trong số này có thể làm việc cho chúng tôi (ngoài việc vô hiệu hóa việc kiểm tra lược đồ hoàn toàn). Cuối cùng, chúng tôi đã có một trận đấu lỡ trong phiên bản Newtonsoft.json

AppConfig của chúng tôi không được cập nhật chính xác:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

Giải pháp là sửa phiên bản lắp ráp thành phiên bản chúng tôi đang thực sự triển khai

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>

Chúng tôi đã gặp sự cố tương tự với phiên bản Newtonsoft.json, khi chúng tôi cập nhật phiên bản, sự cố đã được giải quyết.
Rui Estreito

0

Sau một số nghiên cứu về chủ đề này, tôi thấy rằng lỗi xảy ra về cơ bản nếu bạn có một phiên bản db được tạo trước đó trên máy chủ sql cục bộ của bạn. Vì vậy, bất cứ khi nào bạn có các bản cập nhật trên db và cố gắng cập nhật db / chạy một số mã trên db mà không chạy Update Databaselệnh bằng cách sử dụng Package Manager Console; trước hết, bạn phải xóa db trước đó trên sql express cục bộ của chúng tôi theo cách thủ công.

Ngoài ra, giải pháp này hoạt động trừ khi bạn có AutomaticMigrationsEnabled = false;trong Cấu hình của mình.

Nếu bạn làm việc với hệ thống kiểm soát phiên bản (git, svn, v.v.) và một số nhà phát triển khác cập nhật các đối tượng db trong giai đoạn sản xuất thì lỗi này sẽ tăng lên bất cứ khi nào bạn cập nhật cơ sở mã của mình và chạy ứng dụng.

Như đã nêu ở trên, có một số giải pháp cho việc này trên cơ sở mã. Tuy nhiên, đây là một trong những thực tế nhất cho một số trường hợp.


0

Tôi cũng đang đọc cuốn sách Pro ASP.NET MVC 4 và gặp phải vấn đề tương tự. Đối với tôi, tôi bắt đầu gặp vấn đề sau khi thực hiện các thay đổi được quy định trong phần 'Thêm xác thực mô hình' của cuốn sách. Cách tôi giải quyết vấn đề là bằng cách di chuyển cơ sở dữ liệu của tôi từ localdb sang máy chủ SQL Server 2012 đầy đủ. (BTW, tôi biết rằng tôi thật may mắn khi tôi có thể chuyển sang phiên bản đầy đủ, vì vậy đừng ghét tôi. ;-))) Phải có điều gì đó với việc liên lạc với db gây ra sự cố.


Làm thế nào để bạn biết đó là giao tiếp với db chứ không phải siêu dữ liệu của nó?
flup

2
Xin lỗi vì sự phản ứng chậm. Hóa ra nó không phải là một vấn đề giao tiếp! Việc tạo lại db chỉ che giấu vấn đề, bởi vì tôi lại gặp vấn đề tương tự! Một __Migrationxxx (không thể nhớ tên chính xác của bảng vì tôi vừa xóa nó) được tạo bởi ef. Chỉ cần xóa nó và bạn sẽ được tất cả tốt.
J3Speaks

@ MyJ3 Tất cả mọi người phun ra tất cả các dòng friggin và dòng mã này. Tất cả điều này tôi cần! Xứng đáng là một câu trả lời (Kịch bản tùy chọn).
Terrance00

@ Terrance00 Cảm ơn!
J3Speaks

0

Kiểm tra các bước sau

  1. Cơ sở dữ liệu.SetInitializer (null); -> trong Global.asax.cs

2.

  1. Tên lớp Ngữ cảnh của bạn phải khớp với kiểm tra nó

0

Sửa đổi Global.asax.cs, bao gồm cả Application_Startsự kiện với:

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

5
Cá nhân tôi sẽ rõ ràng hơn một chút về những gì nó làm, cá nhân.
Casey

3
KHÔNG KHÔNG KHÔNG, tôi không muốn sử dụng DropCreateDatabase IfModelChanges 99% thời gian!
Tom Stickel

0

Lỗi này có thể chỉ ra sự cố với chuỗi kết nối của bạn và liệu tên chuỗi kết nối của bạn có khớp với khai báo ngữ cảnh Cơ sở dữ liệu hay không.

Tôi đã gặp lỗi này vì tôi đã đặt tên cơ sở dữ liệu cục bộ sai (lỗi ngớ ngẩn) và tên của chuỗi kết nối trong web.config của "DefaultConnection" không khớp với MyDbContext tức là

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>

0

Hãy thử sử dụng Database SetInitializer, thuộc về sử dụng System.Data.Entity;

Trong Global.asax

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

Điều này sẽ tạo cơ sở dữ liệu mới mỗi khi mô hình của bạn thay đổi. Nhưng cơ sở dữ liệu của bạn sẽ trống. Để điền vào nó với dữ liệu giả, bạn có thể sử dụng Seeding. Mà bạn có thể thực hiện như:

Gieo hạt ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}

0

Thật kỳ lạ, nhưng tất cả các câu trả lời ở đây đều vô dụng đối với tôi. Đối với tôi làm việc khởi tạo

MigrateDatabaseToLatestVersion

Đây là giải pháp của tôi (tôi biết, nó có thể đơn giản hơn nhiều, nhưng đó là cách tôi sử dụng nó):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting chỉ kế thừa từ DropCreateDatabaseAlways nên trong một số trường hợp cụ thể (thử nghiệm), toàn bộ cơ sở dữ liệu được xây dựng lại. Nếu không, nó đã được chuyển sang phiên bản mới nhất.

Nguồn của tôi: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific


0

Tôi gặp vấn đề tương tự khi chúng tôi sử dụng một cơ sở dữ liệu cho hai ứng dụng. Thiết lập disableDatabaseInitialization="true"trong phần loại ngữ cảnh làm việc cho tôi.

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

Xem thêm chi tiết https://msdn.microsoft.com/en-us/data/jj556606.aspx


0

Tạo trình khởi tạo ngữ cảnh tùy chỉnh:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

Lưu ý rằng Migations.Configuration là một lớp được tạo bởi dòng lệnh di chuyển trong Bảng điều khiển quản lý gói. Bạn có thể cần phải thay đổi nội bộ thành công cụ sửa đổi công khai của lớp Migations.Configuration.

Và đăng ký nó từ OmModelCreating của bạn:

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}

-1

Ở đây tôi muốn chia sẻ một phương pháp khác để ngăn lỗi lỗi sao lưu mô hình khi bối cảnh thay đổi là:

1) Mở tệp DbContext của bạn

2) Thêm không gian tên bằng Microsoft.AspNet.Identity.EntityFramework;

3) công khai MyDbContext (): cơ sở ("name = MyDbContext") {Database.SetInitializer (new DropCreateDatabaseAlways ()); }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.