Я не могу пройти эту ошибку. Я просто пытаюсь получить список товаров в выпадающем списке. Использование: Asp.Net Core 1.0 Ядро EntityFramework. MVC Образцовый шаблон.Microsoft.AspNetCore.Mvc.Rendering.SelectListGroup 'требует определения первичного ключа
Я пробовал все, что у меня есть. У меня есть [Key] атрибут над моим Guid/Oid PK. (Является ли это проблемой GUID?) Я добавил HasKey() в свой класс DBContext для Entity/ViewModel, который я использую. он у меня отображается в таблицу исходной модели/ТН (это правильно ??)
я сделал БД Сначала к существующей БД с помощью Microsoft реверса инженера в Entity Framework: https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html#reverse-engineer-your-model
На данный момент, я даже не уверен, что я подключаюсь к моей БД. Я не видел никаких данных.
У меня полная потеря. Помощь приветствуется.
Вот мой пуск класс:
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>();
}
}
Это мой DbContext Класс:
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();
}
Мой Repository (Это где ошибка выкинут при отладке)
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:
My Controller:
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>
}
}
Я добавил этот код. Еще одна ошибка. Тип объекта «Microsoft.AspNetCore.Mvc.Rendering.SelectListGroup» требует определения первичного ключа. –
Есть ли у вас какие-либо другие свойства типа 'IEnumerable' или 'SelectListGroup' для других типов сущностей? Вам нужно будет игнорировать их всех или просто игнорировать эти типы, я обновил ответ. –