net framework first existing conexion cadena application c# wpf entity-framework-core

c# - first - entity framework core web config



Error: el tipo de entidad requiere una clave primaria (5)

Me gustaría ampliar la pregunta formulada en este hilo

Vincular cuadro de lista a la colección de observación

Dándole una habilidad para persistir los datos. La estructura es casi la misma, excepto que instalé Entity Framework Core y creé una clase DbContext para guardar los registros. Agregué un botón para guardar el conjunto de datos en SQL Server. No encontré el error de compilación, pero cuando intenté guardar los datos en la base de datos obtuve esta excepción de tiempo de ejecución:

Mensaje = El tipo de entidad ''Fruto'' requiere que se defina una clave primaria.

La excepción completa en su totalidad se detalla a continuación.

System.InvalidOperationException no fue manejado
HResult = -2146233079
Mensaje = El tipo de entidad ''Fruto'' requiere que se defina una clave primaria.
Fuente = Microsoft.EntityFrameworkCore
StackTrace:
en Microsoft.EntityFrameworkCore.Internal.ModelValidator.ShowError (mensaje de cadena)
en Microsoft.EntityFrameworkCore.Internal.ModelValidator.EnsureNonNullPrimaryKeys (modelo IModel)
en Microsoft.EntityFrameworkCore.Internal.ModelValidator.Validate (modelo IModel)
en Microsoft.EntityFrameworkCore.Internal.RelationalModelValidator.Validate (modelo IModel)
en Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel (contexto DbContext, IConventionSetBuilder conventionSetBuilder, validador de IModelValidator)
en Microsoft.EntityFrameworkCore.Infrastructure.ModelSource. <> c__DisplayClass14_0.b__0 (Objeto k)
en System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 valueFactory)
en Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel (contexto DbContext, IConventionSetBuilder conventionSetBuilder, validador de IModelValidator)
en Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel ()
en Microsoft.EntityFrameworkCore.Internal.LazyRef 1.get_Value()
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_6(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactoryService(FactoryService factoryService, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
1.get_Value()
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_6(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactoryService(FactoryService factoryService, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
1.get_Value()
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_6(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactoryService(FactoryService factoryService, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite (IServiceCallSite callSite, argumento TArgument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite scopedCallSite, proveedor de ServiceProvider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite (IServiceCallSite callSite, argumento TArgument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite scopedCallSite, proveedor de ServiceProvider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure
2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure
2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure
1 accessor)
en Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.get_StateManager ()
en Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.DetectChanges ()
en Microsoft.EntityFrameworkCore.DbContext.TryDetectChanges ()
en Microsoft.EntityFrameworkCore.DbContext.SaveChanges (Boolean acceptAllChangesOnSuccess)
en Microsoft.EntityFrameworkCore.DbContext.SaveChanges ()
at Fruits.MainWindow.SaveFruitCommandBinding_Executed (Object eender, ExecutedRoutedEventArgs e) en D: / Frank / Test / Fruits / Fruits / MainWindow.xaml.cs: línea 50
en System.Windows.Input.CommandBinding.OnExecuted (Object sender, ExecutedRoutedEventArgs e)
en System.Windows.Input.CommandManager.ExecuteCommandBinding (Object sender, ExecutedRoutedEventArgs e, CommandBinding commandBinding)
en System.Windows.Input.CommandManager.FindCommandBinding (CommandBindingCollection commandBindings, Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
en System.Windows.Input.CommandManager.FindCommandBinding (Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
at System.Windows.Input.CommandManager.OnExecuted (Object sender, ExecutedRoutedEventArgs e) at System.Windows.UIElement.OnExecutedThunk (genero de la vajilla de los recortes de los recortes de los recortes de los recortes de los recortes). System.Windows.RoutedEventArgs.InvokeHandler (Manejador de delegados, objetivo del objeto) en System.Windows.RoutedEventHandlerInfo.InvokeHandler (Objeto del objeto, RoutedEventArgs rutedEpl. Windows.UIElement.RaiseEventImpl (DependencyObject sender, RoutedEventArgs args) en System.Windows.UIElement.RaiseEvent (RoutedEventArgs args, Boolean trusted) en System.Windows.Input.RoutedCommand.ExecuteImpl (Objeto), Estado de la casa de campo. Windows.Input.RoutedCommand.ExecuteCore (parámetro Object, IInputElement target, Boolean userInitiated) en MS.Internal.Commands.CommandHel pers.CriticalExecuteCommandSource (ICommandSource commandSource, Boolean userInitiated) en System.Windows.Controls.Primitives.ButtonBase.OnClick () en System.Windows.P.P.Cons. e) en System.Windows.UIElement.OnMouseLeftButtonUpThunk (Objeto remitente, MouseButtonEventArgs e) en System.Windows.Input.MputadoButtonEventArras de las partes de las personas .Pepra. System.Windows.RoutedEventHandlerInfo.InvokeHandler (en) (en) (en) (en) (en) (en) (en) (en) (en) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) (en inglés) en System.Windows.UIElement.OnMouseUpThunk (Object sender, MouseButtonEventArgs e) en System.Windows.Input.MouseButt onEventArgs.InvokeEventHandler (Delegate genericHandler, Object genericTarget) en System.Windows.RoutedEventArgs.InvokeHandler (Delegate handler, Object target) en el estado de juego en el interior de la computadora. source, RoutedEventArgs args, Boolean reRaised) en System.Windows.UIElement.RaiseEventImpl (DependencyObject sender, RoutedEventArgs args) en System.Wawows.encorazon.permisos.Permis.Piezas.UIElement.RaiseTrustedEvent (RoutedEventArgs args) en System. at System.Windows.Input.InputManager.ProcessStagingArea () at System.Windows.Input.InputManager.ProcessInput (InputEventArgs input) en System.Windows.Input.InputP.P.P.P.P.P.P.P.P.Report.InputProvider.ReportInput (InputReport inputReport) (IntPtr hwnd, modo InputMode, marca de tiempo Int32, acciones RawMouseActions, Int32 x, Int32 y, rueda Int32) en System.Windows.Interop.H wndMouseInputProvider.FilterMessage (IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean y manipulado) HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean y manejado) en MS.Win32.HwndSubpes.Consideras.Personas de recreo. ) en System.Windows.Threading.ExceptionWrapper.TryCatchWhen (Origen de objeto, Devolución de llamada delegada, Argumentos de objeto, Int32 numArgs, Delegate catchHandler) en System.Windows.Threading.Dispatcher.LegacyInvokeImpl (DispatcherPriority priority, TimeSpan time) Int32 numArgs) en MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) en MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & msg) en System.Windins.P. er.PushFrameImpl (marco DispatcherFrame) en System.Windows.Threading.Dispatcher.PushFrame (marco DispatcherFrame) en System.Windows.Application.RunDispatcher (Ignorar objeto) en System.Windows.Application.RunInternal (Ventana de ventana). Application.Run (Ventana de ventana) en System.Windows.Application.Run () en Fruits.App.Main () en System.AppDomain._nExecuteAssembly (RuntimeAssembly assembly, String [] args) en System.AppDomain.ExecuteAssembly (String assemblyFile, Evidencia assemblySecurity, String [] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () en System.Threading.ThreadHelper.Rhunny.br.br.P.P.R.P. Boolean preserveSyncCtx) en System.Threading.ExecutionContext.Run (Ejecución de ExecutionContext), Devolución de llamada ContextCallback, Estado del objeto, Boolean preserveSyncCtx) en System.Threading.ExecutionContext.Run (ExecutionContext exec utionContext, devolución de llamada ContextCallback, estado del objeto) en System.Threading.ThreadHelper.ThreadStart () InnerException:

Esta es la clase actualizada de Fruit:

namespace Fruits.ViewModels { [Table("Fruits")] public class Fruit : ViewModelBase { #region Constractor public Fruit() { } public Fruit(string name, String clrString) { FruitName = name; // Parse colors like so: (Color)ColorConverter.ConvertFromString(clrString); FruitColor = clrString; _id = Guid.NewGuid(); } public Fruit(string name, Color clr) { FruitName = name; FruitColor = clr.ToString(); _id = Guid.NewGuid(); } #endregion #region Properties private Guid _id; [Key] public Guid ID { get { return _id; } } #region FruitName private string _fruitname; public string FruitName { get { return _fruitname; } set { if (_fruitname != value) { _fruitname = value; OnPropertyChanged("FruitName"); } } } #endregion #region FruitColor private String _fruitcolor; public String FruitColor { get { return _fruitcolor; } set { if (_fruitcolor != value) { _fruitcolor = value; OnPropertyChanged("FruitColor"); } } } #endregion #region Selected Property private bool _isSelected = true; // NOTE: I renamed this property public bool IsSelected { get { return _isSelected; } set { if (_isSelected != value) { _isSelected = value; OnPropertyChanged("IsSelected"); } } } #endregion #endregion } }

La actualización de MainWindows xaml (para agregar un botón de guardar)

<Window x:Class="Fruits.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Fruits" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <RoutedCommand x:Key="AddFruit" /> <RoutedCommand x:Key=''SaveFruit'' /> </Window.Resources> <Window.CommandBindings> <CommandBinding Command=''{StaticResource AddFruit}'' Executed=''AddFruitCommandBinding_Executed'' CanExecute=''AddFruitCommandBinding_CanExecute'' /> <CommandBinding Command=''{StaticResource SaveFruit}'' Executed=''SaveFruitCommandBinding_Executed'' CanExecute=''SaveFruitCommandBinding_CanExecute'' /> </Window.CommandBindings> <Grid> <StackPanel Orientation=''Vertical'' Margin=''10''> <CheckBox IsChecked="{Binding ShowSelectedFruitOnly}">Selected Fruit Only</CheckBox> <ListBox x:Name=''MyList'' ItemsSource="{Binding FruitsView}" ItemTemplate=''{StaticResource FruitTemp}'' /> <StackPanel Orientation="Horizontal" Margin="0,10,0,0"> <Label Width="100">New Name:</Label> <TextBox Width="200" Text="{Binding NewFruitName, Mode=TwoWay }" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="0,10,0,0"> <Label Width="100">New Color:</Label> <!--<TextBox Width="200" Text="{Binding NewFruitColor, UpdateSourceTrigger=PropertyChanged}" />--> <TextBox Width="200" Text="{Binding NewFruitColor, Mode=TwoWay }" /> <ContentControl Style="{StaticResource ColorSwatch}" Margin="2" VerticalAlignment="Center" Content="{Binding NewFruitColor}" /> </StackPanel> <StackPanel Orientation=''Horizontal''> <Button x:Name=''AddFruit'' Height=''auto'' Width=''auto'' Content=''Add New Fruit 2'' Margin=''0,10,0,0'' Command=''{StaticResource AddFruit}'' /> <Button x:Name=''SaveFruit'' Height=''auto'' Width=''auto'' Content=''Save Fruit'' Margin=''100,10,0,0'' Command=''{StaticResource SaveFruit}'' /> </StackPanel> </StackPanel> </Grid> </Window>

y mi código detrás de los mainwindows (controlador añadido)

using Fruits.ViewModels; using System; using System.Windows; using System.Windows.Input; namespace Fruits { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainViewModel(); ViewModel.AddNewFruit("Jackfruit", "Yellow"); ViewModel.AddNewFruit("Watermelon", "ForestGreen"); ViewModel.AddNewFruit("Apple", "Red"); ViewModel.AddNewFruit("Banana", "Yellow"); ViewModel.AddNewFruit("Orange", "DeepSkyBlue"); //ViewModel.Fruits[0].IsSelected = false; //ViewModel.Fruits[1].IsSelected = false; ViewModel.FruitsView.Refresh(); } public MainViewModel ViewModel { get { return DataContext as MainViewModel; } } private void AddFruitCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { ViewModel.AddNewFruit(); } private void AddFruitCommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = ViewModel != null && !String.IsNullOrWhiteSpace(ViewModel.NewFruitName) && !String.IsNullOrWhiteSpace(ViewModel.NewFruitColor) ; } private void SaveFruitCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { using (var db=new FruitDbContext()) { db.SaveChanges(); } } private void SaveFruitCommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } } }

Mi dbContext recién agregado:

namespace Fruits.ViewModels { public class FruitDbContext:DbContext { public DbSet<Fruit> Fruits { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder) { optionBuilder.UseSqlServer(@"Server = xxx; Database=Test; Integrated Security = True"); } } }

Otras clases permanecen sin cambios, pero las enumeré de todos modos:

ViewModelBase

namespace Fruits.ViewModels { public class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string name) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(name)); } } } } ViewModel using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows.Data; using System.Windows.Media; namespace Fruits.ViewModels { #region MainViewModel Class public class MainViewModel : ViewModelBase { public MainViewModel() { Fruits = new ObservableCollection<Fruit>(); } public ICollectionView FruitsView { get; private set; } #region ShowSelectedFruitOnly Property private bool _showSelectedFruitOnly = true; public bool ShowSelectedFruitOnly { get { return _showSelectedFruitOnly; } set { if (value != _showSelectedFruitOnly) { _showSelectedFruitOnly = value; FruitsView.Refresh(); OnPropertyChanged("ShowSelectedFruitOnly"); } } } #endregion ShowSelectedFruitOnly Property #region Add Methods public void AddNewFruit() { Fruits.Add(new Fruit(NewFruitName, NewFruitColor)); NewFruitName = ""; NewFruitColor = ""; } public void AddNewFruit(string name, string color) { Fruits.Add(new Fruit(name, color)); } public void AddNewFruit(string name, Color color) { Fruits.Add(new Fruit(name, color)); } #endregion Add Methods #region NewFruitName Property private String _newFruitName = default(String); public String NewFruitName { get { return _newFruitName; } set { if (value != _newFruitName) { _newFruitName = value; OnPropertyChanged("NewFruitName"); } } } #endregion NewFruitName Property #region NewFruitColor Property private String _newFruitColor = default(String); public String NewFruitColor { get { return _newFruitColor; } set { if (value != _newFruitColor) { _newFruitColor = value; OnPropertyChanged("NewFruitColor"); } } } #endregion NewFruitColor Property #region Fruits Property private static ObservableCollection<Fruit> _fruits; public ObservableCollection<Fruit> Fruits { get { return _fruits; } private set { if (value != _fruits) { _fruits = value; FruitsView = CollectionViewSource.GetDefaultView(Fruits); FruitsView.Filter = FruitFilterPredicate; FruitsView.Refresh(); OnPropertyChanged("Fruits"); } } } protected bool FruitFilterPredicate(Object o) { if (ShowSelectedFruitOnly) { return (o as Fruit).IsSelected; } return true; } #endregion Fruits Property } #endregion MainViewModel Class }

App.xaml

<Application x:Class="Fruits.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Fruits" StartupUri="MainWindow.xaml"> <Application.Resources> <Style x:Key="ColorSwatch" TargetType="ContentControl"> <Setter Property="Width" Value="24" /> <Setter Property="Height" Value="24" /> <Setter Property="IsTabStop" Value="false" /> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="Gray" StrokeThickness="1"> <Rectangle.Fill> <SolidColorBrush Color="{Binding}" /> </Rectangle.Fill> </Rectangle> </DataTemplate> </Setter.Value> </Setter> </Style> <DataTemplate x:Key=''FruitTemp''> <StackPanel Orientation=''Horizontal'' Margin=''5''> <TextBlock x:Name=''tbName'' Text=''{Binding FruitName}'' Margin=''10,0,0,0'' Width=''100'' /> <TextBlock x:Name=''tbColor'' Text=''{Binding FruitColor}'' Margin=''10,0,0,0'' Width=''100'' /> <ContentControl Width="16" Height="16" Style="{StaticResource ColorSwatch}" Content="{Binding FruitColor}" /> <!-- The problem here was you were trying to bind Checked, an event, instead if IsChecked, a bool? property. --> <CheckBox x:Name=''cbSelected'' Content=''Selected'' Margin=''10,0,0,0'' IsChecked=''{Binding IsSelected}'' /> </StackPanel> </DataTemplate> </Application.Resources> </Application>

La estructura de mi proyecto.

Mi tabla en SQL Server:

CREATE TABLE [dbo].[Fruits] ( [ID] [uniqueidentifier] NOT NULL, [FruitName] [nvarchar](50) NULL, [FruitColor] [nvarchar](50) NULL, [IsSelected] [nvarchar](1) NULL, CONSTRAINT [PK_Fruit] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

Por favor, indique por qué el mensaje decía que no había una clave principal mientras existiera.


El tipo de entidad ''DisplayFormatAttribute'' requiere que se defina una clave primaria.

En mi caso, descubrí que el problema era que usaba propiedades como esta:

public string LastName { get; set; } //OK public string Address { get; set; } //OK public string State { get; set; } //OK public int? Zip { get; set; } //OK public EmailAddressAttribute Email { get; set; } // NOT OK public PhoneAttribute PhoneNumber { get; set; } // NOT OK

No estoy seguro de si hay una mejor manera de resolverlo, pero cambié el atributo Correo electrónico y número de teléfono a una cadena. Problema resuelto.


Este mensaje de excepción no significa que requiere que se defina una clave principal en su base de datos , significa que requiere que se defina una clave primaria en su clase .

Aunque has intentado hacerlo:

private Guid _id; [Key] public Guid ID { get { return _id; } }

Esto no tiene ningún efecto, ya que Entity Framework ignora las propiedades de solo lectura. Tiene que: cuando recupera un registro Fruits de la base de datos, construye un objeto Fruit y luego llama a los establecedores de propiedades para cada propiedad asignada. Eso nunca va a funcionar para propiedades de solo lectura.

Necesita Entity Framework para poder establecer el valor de ID . Esto significa que la propiedad necesita tener un setter.


He encontrado un poco diferente causa del error. Parece que SQLite quiere usar el nombre de propiedad de la clase de clave primaria correcta. Asi que...

Nombre incorrecto de PK

public class Client { public int SomeFieldName { get; set; } // It is the ID ... }

Nombre de PK correcto

public class Client { public int Id { get; set; } // It is the ID ... } public class Client { public int ClientId { get; set; } // It is the ID ... }

Todavía es posible usar el nombre de PK incorrecto pero tenemos que usar el atributo [Clave] como

public class Client { [Key] public int SomeFieldName { get; set; } // It is the ID ... }


Su propiedad de identificación necesita tener un setter. Sin embargo, el colocador puede ser privado. El atributo [Key] no es necesario si la propiedad se llama "Id", ya que la encontrará a través de la convención de nomenclatura donde busca una clave con el nombre "Id".

public Guid Id { get; } // Will not work public Guid Id { get; set; } // Will work public Guid Id { get; private set; } // Will also work


Vine aquí con un error similar:

System.InvalidOperationException: ''El tipo de entidad'' MyType ''requiere que se defina una clave principal.''

Después de leer la respuesta por hvd, me di cuenta de que simplemente había olvidado hacer que mi propiedad clave fuera "pública". Esta..

namespace MyApp.Models.Schedule { public class MyType { [Key] int Id { get; set; } // ...

Debería ser esto ..

namespace MyApp.Models.Schedule { public class MyType { [Key] public int Id { get; set; } // must be public! // ...