ASP.netMVC3環境でEntityFrameworkでAdvantageDatabaseServer(ADS Ver.9.1)を処理する必要があります。
私はすでにこれだけのためにほぼ2週間を費やしました:(しかしそれでも私は答えを見つけることができませんでした。
正しいアドバイスを得るために、私はどのようにそして何をしたかを段階的に示すように努めます。ですから、私が犯した間違いを見つけたり、私が試すことができることを知っている場合は、私にアドバイスしてください。plz ..
まず、ADSでTESTテーブルを作成しました。
CREATE TABLE TEST (
ID AutoInc,
Name CIChar( 50 )) IN DATABASE;
IDを主キーとして定義します。
そして、コンソールアプリケーションを使用してこのテーブルにアクセスしようとしました。
Visual Studio 2010を使用して、新しいコンソールアプリケーション(C#)を作成します
そして私はこのようにタイプしました、
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Advantage.Data.Provider;
namespace Ads_Console_Test
{
class Program
{
static void Main(string[] args)
{
AdsConnection conn = new AdsConnection("Data Source=\\\\10.0.111.4:6262\\20090622\\SHK\\SHK.ADD;ServerType=REMOTE;User ID=AdsSys;Password=XXXXX;");
AdsCommand cmd;
AdsDataReader reader;
int iField;
try
{
// make the connection to the server
conn.Open();
// create a command object
cmd = conn.CreateCommand();
// specify a simple SELECT statement
cmd.CommandText = "select * from TEST";
// execute the statement and create a reader
reader = cmd.ExecuteReader();
// dump the results of the query to the console
while (reader.Read())
{
for (iField = 0; iField < reader.FieldCount; iField++)
Console.Write(reader.GetValue(iField) + " ");
Console.WriteLine();
}
// close the reader (can’t execute other statements
// on this command or connection) until it is closed
reader.Close();
conn.Close();
}
catch (AdsException e)
{
// print the exception message
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
}
}
実行すると、ADSに正常に接続し、データも取得します。
ご覧のとおり、テーブルには3つの行があります。
今、
EntityFrameworkを使用してADSにアクセスしてみます。(MVC3)
MVC3フレームワークで新しいプロジェクトを作成します。空のテンプレートを選択しました。
そして、Advantage.Data.ProviderをReferenceに追加します。
次に、Web.Config(root)ファイルを変更し、connectionStringsを追加します。
<connectionStrings>
<add name="EFAdsContext" connectionString="Data Source=\\10.0.111.4:6262\20090622\SHK\SHK.ADD;ServerType=REMOTE;User ID=adsSys;Password=XXXXX;
TrimTrailingSpaces=True;" providerName="Advantage.Data.Provider" />
</connectionStrings>
そして、Modelsフォルダーに3つのクラスを作成しました。
- EFAdsContext.cs
- TestRepository.cs
- TEST.cs
これがコードです、
1. EFAdsContext.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
namespace Ads_test_mvc3.Models
{
public class EFAdsContext : DbContext
{
public DbSet<TEST> TEST { get; set; }
}
}
2. TestRepository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Ads_test_mvc3.Models
{
public class TestRepository
{
private EFAdsContext context = new EFAdsContext();
public IQueryable<TEST> test
{
get { return context.TEST; }
}
}
}
3. TEST.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace Ads_test_mvc3.Models
{
public class TEST
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
}
}
そして、HomeControllers.csをControllersフォルダーに作成します。
HomeControllers.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Ads_test_mvc3.Models;
namespace Ads_test_mvc3.Controllers
{
public class HomeController : Controller
{
public ViewResult Index()
{
TestRepository tests = new TestRepository();
int cnt = tests.test.Count();
ViewBag.cnt = cnt;
return View();
}
}
}
そして最後にHomeControllerのビューを追加します
/Views/Home/Index.cshtml
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
Cnt : @ViewBag.cnt
そして、このアプリケーションを実行し、
次に、このエラーメッセージが表示されます。= 3
私が知っているのは長い文章ですが、私はできるだけ詳細に書くようにしました。
誰かがこの問題を解決する方法を知っているなら、私に知らせてください。
ありがとうございました!
[スタックトレース]
[KeyNotFoundException: The given key was not present in the dictionary.]
System.Collections.Generic.Dictionary`2.get_Item(TKey key) +9619597
Advantage.Data.Provider.AdsProviderManifest.GetStoreType(TypeUsage edmType) +1150
System.Data.Entity.ModelConfiguration.Edm.Services.StructuralTypeMappingGenerator.MapTableColumn(EdmProperty property, DbTableColumnMetadata tableColumnMetadata, Boolean isInstancePropertyOnDerivedType, Boolean isKeyProperty) +60
System.Data.Entity.ModelConfiguration.Edm.Services.PropertyMappingGenerator.Generate(EdmEntityType entityType, IEnumerable`1 properties, DbEntitySetMapping entitySetMapping, DbEntityTypeMappingFragment entityTypeMappingFragment, IList`1 propertyPath, Boolean createNewColumn) +1293
System.Data.Entity.ModelConfiguration.Edm.Services.EntityTypeMappingGenerator.Generate(EdmEntityType entityType, DbDatabaseMapping databaseMapping) +496
System.Data.Entity.ModelConfiguration.Edm.Services.DatabaseMappingGenerator.GenerateEntityTypes(EdmModel model, DbDatabaseMapping databaseMapping) +122
System.Data.Entity.ModelConfiguration.Edm.Services.DatabaseMappingGenerator.Generate(EdmModel model) +30
System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo) +189
System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) +58
System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) +62
System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) +117
System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +453
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +18
System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() +57
System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() +15
System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() +37
System.Linq.Queryable.Count(IQueryable`1 source) +50
Ads_test_mvc3.Controllers.HomeController.Index() in C:\Users\mark\Documents\Visual Studio 2010\Projects\Ads_test_mvc3\Ads_test_mvc3\Controllers\HomeController.cs:20
lambda_method(Closure , ControllerBase , Object[] ) +62
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263
System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
System.Web.Mvc.Controller.ExecuteCore() +116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8969117
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184