0

最初に Entityframework コードを使用して、ASP.NET MVC 4 アプリを実装しようとしています。実際には、カスタムとデフォルトの UsersContext の 2 つのデータ コンテキストがあります。

namespace Namespace.Models
{
    public class StoreDB : DbContext
    {
        public DbSet<Supplier> Suppliers { get; set; }
        public DbSet<Vendor> Vendors { get; set; }
        public DbSet<Product> Products { get; set; }
    }
}

public class UsersContext : DbContext
{
    public UsersContext() : base("StoreDB")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
}

おそらくその発言public UsersContext() : base("StoreDB")は間違っている。しかし、デフォルト値: base("DefaultConnection")のままにすると、DefaultConnectionデータベースが作成されました。もちろん、「StoreDB」という名前のデータベースが 1 つだけ必要です。

UserProfileに属する にいくつかの変更を加えましたUsersContext

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime? DoB { get; set; }
}

そして、次のように Global.asax を更新しました。

Database.SetInitializer(new Namespace.Models.StoreDbInitializer());
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Namespace.Models.UsersContext>());

しかし、アプリケーションを実行すると、次のエラーが発生します。

CREATE DATABASE permission denied in database 'master'.

「マスター」の下にデータベースを作成しようとするのはなぜですか?

私の接続文字列は次のとおりです。

<add name="StoreDB" 
     connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=MyDB; Integrated Security=SSPI; MultipleActiveResultSets=True" 
     providerName="System.Data.SqlClient"/>
4

3 に答える 3

1

IISでサイトを実行していますか?アプリケーションプールは、SQL Expressインスタンスにデータベースを作成できるアカウントで実行されていますか?として実行されている場合は、としてApplicationPoolIdentity実行するように変更してみてくださいNetworkService

また、を削除してUsersContext、プロパティをStoreDBコンテキストに移動してみてください。接続文字列と同じ名前のコンテキストが1つ必要です

于 2013-01-16T21:02:45.787 に答える
0

問題は、管理者としてではなくVisual Studioを実行していたことだと思います..正確な理由はわかりませんが、今では問題ないようです。ご迷惑をおかけして申し訳ありません。お時間とご回答をありがとうございます。

于 2013-01-17T08:54:42.630 に答える
0

「StoreDB」という名前の接続文字列があり、代わりにその名前のデータベースを作成しようとしているという事実を無視しているようです (これは、呼び出している同じコンストラクターの別の関数です)。

次のように、これが接続文字列の名前であることをコンストラクターに明示的に伝えることができます。

public UsersContext() : base("name=StoreDB")
...

それを試して、うまくいくかどうか教えてください。

于 2013-01-16T22:29:41.677 に答える