0

このエラーは発生しません。私は単純に商品のリストをドロップダウンに入れようとしています。使用: Asp.Netコア1.0 EntityFrameworkコア。 MVC リポジトリパターン。Microsoft.AspNetCore.Mvc.Rendering.SelectListGroup 'でプライマリキーを定義する必要があります

私はグーグルで行ったことをすべて試しました。 Guid/Oid PKに対して[Key]属性があります。 (それはGUIDの問題ですか?) 私は使用しているEntity/ViewModelに私のDBContextクラスにHasKey()を追加しました。私は、この時点でhttps://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html#reverse-engineer-your-model

: 私は

(??これが正しいです)、それは元のモデル/商品表にマッピングされてい私は、MicrosoftがEntity Frameworkの中にリバースエンジニアリング使用してDBを既存のDBファーストをしました私が自分のDBに接続しているかどうかは分かりません。私はデータが引き抜かれるのを見ていません。

私は完全に迷っています。ヘルプは高く評価されます。これは私のDBContextクラスです

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
      .AddEnvironmentVariables(); 

     if (env.IsDevelopment()) 
     { 
      // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately. 
      builder.AddApplicationInsightsSettings(developerMode: true); 
     } 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 

     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddDbContext<ltgwarehouseContext>(options => options.UseSqlServer(Configuration["DefaultConnection:ConnectionString"])); 
     services.AddMvc(); 
     services.AddSingleton<ICommodityRepository, CommodityRepository>(); 


    } 
} 

:ここ

は私のスタートアップクラスです

 public partial class ltgwarehouseContext : DbContext 
    { 
//  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
//  { 
////#warning// To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. 
//   optionsBuilder.UseSqlServer(@"Server=.;Database=ltgwarehouse;Trusted_Connection=True;"); 
//  } 
     public ltgwarehouseContext(DbContextOptions<ltgwarehouseContext> options) 
      : base(options) 
     { } 


     //public ltgwarehouseContext() 
     //{ 
     //} 
     public DbSet<CommodityViewModel> CommoditiesList { get; set; } 

     public DbSet<Commodity> Commodities { get; set; } 



     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<CommodityViewModel>(entity => 
      { 
       modelBuilder.Entity<CommodityViewModel>().ToTable("Commodity"); 
       modelBuilder.Entity<CommodityViewModel>().HasKey(c => c.Oid); 
       //.HasName("PK_Commodity"); 
      }); 
    } 
    } 

私のViewModel:

public partial class CommodityViewModel 
    { 
     public CommodityViewModel() 
     { 

     } 

     public IEnumerable<SelectListItem> CommoditiesList { get; set; } 
     [Key] 
     public Guid Oid { get; set; } 

     public string Code { get; set; } 

     public string Description { get; set;} 
} 

マイインタフェース:

public interface ICommodityRepository 
{ 

    IEnumerable<CommodityViewModel> GetCommodities(); 

} 

マイ・リポジトリ(デバッグするときにエラーがスローされます場所です)

public class CommodityRepository : ICommodityRepository 
{  
    private readonly ltgwarehouseContext _context; 


    public CommodityRepository(ltgwarehouseContext context) 
    { 
     _context = context; 
    } 

    public IEnumerable<CommodityViewModel> GetCommodities() 
    { 
     return _context.CommoditiesList.ToList(); 
    } 

} 

スタックトレース:

System.InvalidOperationException was unhandled by user code 
    HResult=-2146233079 
    Message=The entity type 'Microsoft.AspNetCore.Mvc.Rendering.SelectListGroup' requires a primary key to be defined. 
    Source=Microsoft.EntityFrameworkCore 
    StackTrace: 
     at Microsoft.EntityFrameworkCore.Internal.ModelValidator.ShowError(String message) 
     at Microsoft.EntityFrameworkCore.Internal.ModelValidator.Validate(IModel model) 
     at Microsoft.EntityFrameworkCore.Internal.RelationalModelValidator.Validate(IModel model) 
     at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator) 
     at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) 
     at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() 
     at Microsoft.EntityFrameworkCore.Internal.LazyRef`1.get_Value() 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 
     at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) 
     at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor) 
     at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.<.ctor>b__2_0() 
     at Microsoft.EntityFrameworkCore.Internal.LazyRef`1.get_Value() 
     at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator() 
     at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
     at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
     at Lansing.BasisMap.Domain.CommodityRepository.GetCommodities() in C:\LTG Projects\Basis Map\Lansing.Geo\Lansing.BasisMap.Domain\Models\Repositories\CommodityRepository.cs:line 52 
     at Lansing.BasisMap.Controllers.HomeController.Index() in C:\LTG Projects\Basis Map\Lansing.Geo\Lansing.BasisMap\Controllers\HomeController.cs:line 30 
     at lambda_method(Closure , Object , Object[]) 
     at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionFilterAsync>d__28.MoveNext() 
    InnerException: 

マイコントローラーアクション:

public IActionResult Index() 
{ 
    ViewBag.Commodities = _commoditiyRepository.GetCommodities().Select(c => new SelectListItem() { Text = c.Code, Value = c.Oid.ToString() }).Cast<CommodityViewModel>().ToList(); 
    return View(); 
} 

そして最後に、私のビュー:

@model MyCompany.BasisMap.Domain.Models.CommodityViewModel 
         @if (ViewBag.Commodities == null) 
         { 
          throw new Exception("No Data!"); 

         } 
         else 
         { 
          foreach (var commoditiy in ViewBag.Commodities) 
          { 
           <li> 
            @commoditiy.code 
           </li> 
          } 

         } 

答えて

0

あなたがCommodityViewModel.CommoditiesListを削除するか、少なくともそれを無視する必要があります。

modelBuilder.Entity<CommodityViewModel>().Ignore(c => c.CommoditiesList); 

または型自体を無視する:

modelBuilder.Ignore<SelectListItem>(); 
modelBuilder.Ignore<SelectListGroup>(); 
+0

私はこのコードを追加しました。まだ同じエラー。エンティティタイプ 'Microsoft.AspNetCore.Mvc.Rendering.SelectListGroup'には、主キーを定義する必要があります。 –

+0

他のエンティティタイプで 'IEnumerable 'または 'SelectListGroup'型の他のプロパティを持っていますか?それらをすべて無視するか、これらのタイプを無視する必要があります。私は答えを更新しました。 –

関連する問題