2016-06-17 26 views
0

我想學習來自傳統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方法?

+0

我認爲這樣做會更有意義,使用工廠而不是嘗試實現它作爲接口。換句話說,您只需要一個類似於'GetContextFor(Id)'的方法,它只會返回應用程序上下文的實例化版本和相應的提供程序集。 –

+0

Chris,我刪除了IMyDataContext,以便MySQL和MSSQL DbSet構建器現在只能從DbContext派生。然後使用我現有的selectDbProvider函數,將其更改爲返回DbContext而不是IMyDataContext。但是現在當我嘗試_dbd.ModelData它不能識別它 - System.Data.Entity.DbContext不包含ModelData的定義。 – xgrinderx

回答

1

爲您的界面添加一個方法。

DbEntityEntry Entry(Object entity) 

https://msdn.microsoft.com/en-us/library/gg696238(v=vs.113).aspx

編輯:

public class dbMyContext : DbContext 
{ 
    //snip 

    public dbMyContext(DbConnection existingConnection, boolcontextOwnsConnection) : base(existingConnection, contextOwnsConnection) { } 

    public dbMyContext(string connectionString) : base(connectionString) { } 

    //snip 

} 

調整你的selectDbProvider類,而不是使用dbMySQL和dbMSSQL dbMyContext。

現在您正在使用O/RM。 :)

+0

嗯,我剛剛添加了該頁面上顯示的內容,並且它顯示「修飾符'public'對此項目無效」,方法名稱爲Entry下面的藍線。 – xgrinderx

+0

是的,你不能在界面中有修飾符。拿出公衆,它應該是快樂的。 – Spivonious

+0

工作正常!顯然,我的聲望不足以成功地回答你的答案。謝謝! – xgrinderx