我想學習來自傳統ASP/VBScript背景的C#。C#MVC4 noob - 使用DbContext定義接口包含輸入方法
鋒線上(以防萬一有人能回答沒有所有的以下背景信息和代碼) - 我的DbContext接口不允許我這樣做:
_dbcontext.Entry(model).State = EntityState.Modified;
這不太願意我嘗試使用具有以下錯誤的輸入方法:
'MyNamespace.Models.IMyDataContext'不包含'Entry'的定義,並且沒有可以找到接受'MyNamespace.Models.IMyDataContext'類型的第一個參數的擴展方法'Entry' (您是否缺少使用指令或裝配參考?)
如何正確定義我的接口,以便它將包含來自DbContext類的Entry方法?
背景
我有某人誰(據說)知道自己的東西,幫我把下面的代碼設置用於連接MSSQL或MySQL基於我們從一個共同的連接信息表中檢索數據。 MSSQL和MySQL中的模式與數據模型相同。
public interface IMyDataContext
{
DbSet<MyModel> ModelData { get; set; }
}
public class dbMySQL : DbContext, IMyDataContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var table = modelBuilder.Entity<MyModel>().ToTable("tablename");
table.HasKey(t => t.Id);
table.Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
table.Property(t => t.Key);
table.Property(t => t.Value);
base.OnModelCreating(modelBuilder);
}
public dbMySQL(DbConnection existingConnection, boolcontextOwnsConnection) : base(existingConnection, contextOwnsConnection) { }
public DbSet<MyModel> ModelData { get; set; }
}
public class dbMSSQL : DbContext, IMyDataContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var table = modelBuilder.Entity<MyModel>().ToTable("tablename");
table.HasKey(t => t.Id);
table.Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
table.Property(t => t.Key);
table.Property(t => t.Value);
base.OnModelCreating(modelBuilder);
}
public dbMSSQL(string connectionString) : base(connectionString) { }
public DbSet<MyModel> ModelData { get; set; }
}
使用上面的代碼,我已經能夠從表中成功地抓住連接信息和返回的DbContext如下:
private IMyDataContext selectDbProvider(int Id)
{
// Get database connection info
var connInfo = _db.ConnModel.Find(Id);
string dbProvider = connInfo.dbType.ToString();
IMyDataContext _dbd;
if (dbProvider == "MySql.Data.MySqlClient")
{
var connectionStringBuilder = new MySqlConnectionStringBuilder();
connectionStringBuilder.Server = connInfo.dbServer;
connectionStringBuilder.UserID = connInfo.dbUser;
connectionStringBuilder.Password = connInfo.dbPassword;
connectionStringBuilder.Database = connInfo.dbName;
connectionStringBuilder.Port = 3306;
_mysqlconn = new MySqlConnection(connectionStringBuilder.ConnectionString);
_dbd = new dbMySQL(_mysqlconn, false);
}
else
{
var connectionStringBuilder = new SqlConnectionStringBuilder();
connectionStringBuilder.DataSource = connInfo.dbServer;
connectionStringBuilder.UserID = connInfo.dbUser;
connectionStringBuilder.Password = connInfo.dbPassword;
connectionStringBuilder.InitialCatalog = connInfo.dbName;
_dbd = new dbMSSQL(connectionStringBuilder.ConnectionString);
}
return _dbd;
}
使用上述所有的,我可以成功地訪問數據MySQL或MSSQL:
_dbd = selectDbProvider(Id);
model = _dbd.ModelData.ToList();
但是,當我嘗試執行更新操作時,出現上面提到的錯誤消息。我怎樣才能正確定義我的接口,使其包含來自DbContext類的Entry方法?
我認爲這樣做會更有意義,使用工廠而不是嘗試實現它作爲接口。換句話說,您只需要一個類似於'GetContextFor(Id)'的方法,它只會返回應用程序上下文的實例化版本和相應的提供程序集。 –
Chris,我刪除了IMyDataContext,以便MySQL和MSSQL DbSet構建器現在只能從DbContext派生。然後使用我現有的selectDbProvider函數,將其更改爲返回DbContext而不是IMyDataContext。但是現在當我嘗試_dbd.ModelData它不能識別它 - System.Data.Entity.DbContext不包含ModelData的定義。 – xgrinderx