Adamの答え here に従い、Entity Frameworkが動作するようになり、Seed()
メソッドも動作するようになりました。
しかし、次のようにデータベースにアクセスしようとすると:
_ public User FindUserByID(int id)
{
return (from item in this.Users
where item.ID == id
select item).SingleOrDefault();
}
.............................................................................
// GET: /Main/
public ActionResult Index(int? id)
{
var db = UserDataBaseDB.Create();
if (!id.HasValue)
id = 0;
return View(db.FindUserByID(id.Value));
}
_
_return (from item in this.Users
_で例外をスローします:
_Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.BaseCs'.
_
私はそれをreturn this.Users.ElementAt(id);
に置き換えようとしましたが、それからこの例外をスローします。
_LINQ to Entities does not recognize the method 'MySiteCreator.Models.User ElementAt[User](System.Linq.IQueryable
_ 1 [MySiteCreator.Models.User]、Int32) 'メソッド。このメソッドはストア式に変換できません。
誰も私を助けることができますか?
ありがとうございました!
例外の詳細:System.Data.SqlClient.SqlException:無効なオブジェクト名 'dbo.BaseCs'
このエラーは、EFがLINQを、データベースに存在しないdbo.BaseCs
という名前のオブジェクト(ほとんどの場合テーブル)を使用するsqlステートメントに変換していることを意味します。
データベースを調べて、そのテーブルが存在するかどうか、または別のテーブル名を使用する必要があるかどうかを確認してください。また、フォローしているチュートリアルへのリンクを投稿できる場合は、あなたがやっていることをフォローするのに役立ちます。
'adrift'で言及されているように、モデルクラス名とテーブル名が一致していない可能性があります。これらを同じにするか、テーブル名とは異なるモデルクラス名を保持する場合(OAuthMembershipで使用した場合)に、以下の例を使用します。モデルクラス名はOAuthMembershipであるのに対し、テーブル名はwebpages_OAuthMembershipであることに注意してください。
モデルにテーブル属性を提供する:
[Table("webpages_OAuthMembership")]
public class OAuthMembership
または、DBContext OnModelCreatingをオーバーライドしてマッピングを提供します。
class webpages_OAuthMembershipEntities : DbContext
{
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
var config = modelBuilder.Entity<OAuthMembership>();
config.ToTable( "webpages_OAuthMembership" );
}
public DbSet<OAuthMembership> OAuthMemberships { get; set; }
}
このようなマッピングを提供している場合:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ClassificationMap());
modelBuilder.Configurations.Add(new CompanyMap());
modelBuilder.Configurations.Add(new GroupMap());
....
}
BaseCのマップを忘れずに追加してください。
見つからない場合、コンパイルエラーは発生しません。ただし、エンティティを使用すると実行時エラーが発生します。
テーブル名の複数形化に関する問題かもしれません。以下のスニペットを使用して、この規則をオフにすることができます。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
EFはdbo.BaseCsという名前のテーブルを探しています。エンティティ名の複数形の問題である可能性があります。これを確認してください link 。
EDIT:リンクを更新しました。
スキーマとテーブルの両方を2つの異なる場所で定義する必要があります。
コンテキストはスキーマを定義します
public class BContext : DbContext
{
public BContext(DbContextOptions<BContext> options) : base(options)
{
}
public DbSet<PriorityOverride> PriorityOverrides { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("My.Schema");
builder.ApplyConfiguration(new OverrideConfiguration());
}
}
そして各テーブル
class PriorityOverrideConfiguration : IEntityTypeConfiguration<PriorityOverride>
{
public void Configure(EntityTypeBuilder<PriorityOverride> builder)
{
builder.ToTable("PriorityOverrides");
...
}
}
の代わりに
modelBuilder.Entity<BaseCs>().ToTable("dbo.BaseCs");
試してください:
modelBuilder.Entity<BaseCs>().ToTable("BaseCs");
テーブル名がdbo.BaseCs
であっても