Saya ingin memperluas pertanyaan yang diajukan di thread ini
Mengikat listbox untuk observablecollection
dengan memberikan kemampuan untuk terus-menerus data. Struktur ini hampir sama kecuali saya menginstal Entity Framework Core, menciptakan sebuah DbContext
kelas untuk memegang catatan. Saya menambahkan sebuah tombol untuk menyimpan data ke SQL Server. Saya tidak menemukan kompilasi kesalahan tapi ketika saya mencoba untuk menyimpan data dalam database yang saya punya ini jangka waktu pengecualian:
Pesan=jenis entitas 'Buah' membutuhkan primary key untuk didefinisikan. Seluruh terkecuali dalam keseluruhan yang terdaftar di bawah ini System.InvalidOperationException adalah tidak tertangani HResult=-2146233079 Pesan=jenis entitas 'Buah' membutuhkan primary key untuk didefinisikan. Sumber=Microsoft.EntityFrameworkCore jejak stack: di Microsoft.EntityFrameworkCore.Internal.ModelValidator.ShowError(String pesan) di Microsoft.EntityFrameworkCore.Internal.ModelValidator.EnsureNonNullPrimaryKeys(berdikari adalah pensuplai dan penyedia model) di Microsoft.EntityFrameworkCore.Internal.ModelValidator.Memvalidasi(berdikari adalah pensuplai dan penyedia model) di Microsoft.EntityFrameworkCore.Internal.RelationalModelValidator.Memvalidasi(berdikari adalah pensuplai dan penyedia model) di Microsoft.EntityFrameworkCore.Infrastruktur.ModelSource.CreateModel(DbContext konteks, IConventionSetBuilder conventionSetBuilder, IModelValidator validator) di Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.<>cDisplayClass14_0.
b0(Objek k) pada Sistem.Koleksi.Bersamaan.ConcurrentDictionary DisplayClass16_0.2.GetOrAdd(TKey kunci, Func
2 valueFactory) di Microsoft.EntityFrameworkCore.Infrastruktur.ModelSource.GetModel(DbContext konteks, IConventionSetBuilder conventionSetBuilder, IModelValidator validator) di Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() di Microsoft.EntityFrameworkCore.Internal.LazyRef`1.get_Value() di Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model() di Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServiceCollectionextensions.<>c.b 0_6(IServiceProvider p) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactoryService(FactoryService factoryService, ServiceProvider provider) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, Targumen argumen) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite callSite, Targumen argumen) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, Targumen argumen) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) di Microsoft.Ekstensi.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite callSite, Targumen argumen) di Microsoft.Extensions.DependencyInjection.ServiceProvider.<>cb__0(ServiceProvider provider) di Microsoft.Ekstensi.DependencyInjection.ServiceProvider.GetService(Jenis serviceType) di Microsoft.Ekstensi.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) di Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 pengakses) di Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.get_StateManager() di Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.DetectChanges() di Microsoft.EntityFrameworkCore.DbContext.TryDetectChanges() di Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess) di Microsoft.EntityFrameworkCore.DbContext.SaveChanges() pada Buah-buahan.MainWindow.SaveFruitCommandBinding_Executed(Object sender, ExecutedRoutedEventArgs e) dalam D:\Frank\Test\Fruits\Fruits\MainWindow.xaml.cs:line 50 pada Sistem.Windows.Input.CommandBinding.OnExecuted(Object sender, ExecutedRoutedEventArgs e) pada Sistem.Windows.Input.CommandManager.ExecuteCommandBinding(Object sender, ExecutedRoutedEventArgs e, CommandBinding commandBinding) pada Sistem.Windows.Input.CommandManager.FindCommandBinding(CommandBindingCollection commandBindings, Object sender, RoutedEventArgs e, ICommand perintah, Boolean mengeksekusi) pada Sistem.Windows.Input.CommandManager.FindCommandBinding(Object sender, RoutedEventArgs e, ICommand perintah, Boolean mengeksekusi) pada Sistem.Windows.Input.CommandManager.OnExecuted(Object sender, ExecutedRoutedEventArgs e) di Sistem.Windows.UIElement.OnExecutedThunk(Object sender, ExecutedRoutedEventArgs e) di Sistem.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler(Delegasi genericHandler, Objek target) di Sistem.Windows.RoutedEventArgs.InvokeHandler(Delegasi handler, Objek target) di Sistem.Windows.RoutedEventHandlerInfo.InvokeHandler(Objek target, RoutedEventArgs routedEventArgs) di Sistem.Windows.EventRoute.InvokeHandlersImpl(Objek sumber, RoutedEventArgs args, Boolean reRaised) di Sistem.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) di Sistem.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean terpercaya) di Sistem.Windows.Input.RoutedCommand.ExecuteImpl(Objek parameter, IInputElement target, Boolean userInitiated) di Sistem.Windows.Input.RoutedCommand.ExecuteCore(Objek parameter, IInputElement target, Boolean userInitiated) di MS Internal.Perintah.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) di Sistem.Windows.Kontrol.Primitif.ButtonBase.OnClick() di Sistem.Windows.Kontrol.Tombol.OnClick() di Sistem.Windows.Kontrol.Primitif.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) di Sistem.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e) di Sistem.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegasi genericHandler, Objek genericTarget) di Sistem.Windows.RoutedEventArgs.InvokeHandler(Delegasi handler, Objek target) di Sistem.Windows.RoutedEventHandlerInfo.InvokeHandler(Objek target, RoutedEventArgs routedEventArgs) di Sistem.Windows.EventRoute.InvokeHandlersImpl(Objek sumber, RoutedEventArgs args, Boolean reRaised) di Sistem.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) di Sistem.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e) di Sistem.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegasi genericHandler, Objek genericTarget) di Sistem.Windows.RoutedEventArgs.InvokeHandler(Delegasi handler, Objek target) di Sistem.Windows.RoutedEventHandlerInfo.InvokeHandler(Objek target, RoutedEventArgs routedEventArgs) di Sistem.Windows.EventRoute.InvokeHandlersImpl(Objek sumber, RoutedEventArgs args, Boolean reRaised) di Sistem.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) di Sistem.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) di Sistem.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean terpercaya) di Sistem.Windows.Input.InputManager.ProcessStagingArea() di Sistem.Windows.Input.InputManager.ProcessInput(InputEventArgs input) di Sistem.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) di Sistem.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions tindakan, Int32 x, Int32 y, Int32 roda) di Sistem.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& ditangani) di Sistem.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& ditangani) di MS Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& ditangani) di MS Win32.HwndSubclass.DispatcherCallbackOperation(Object o) di Sistem.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegasi callback, Objek args, Int32 numArgs) di Sistem.Windows.Threading.ExceptionWrapper.TryCatchWhen(Objek sumber, Delegasi callback, Objek args, Int32 numArgs, Delegasi catchHandler) di Sistem.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority prioritas, jangka Waktu timeout, Delegasi metode, Objek args, Int32 numArgs) di MS Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) di MS Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) di Sistem.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) di Sistem.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) di Sistem.Windows.Aplikasi.RunDispatcher(Objek abaikan) di Sistem.Windows.Aplikasi.RunInternal(Jendela) di Sistem.Windows.Aplikasi.Menjalankan(Jendela) di Sistem.Windows.Aplikasi.Run() pada Buah-buahan.Aplikasi.Main() di Sistem.AppDomain._nExecuteAssembly(RuntimeAssembly perakitan, String[] args) di Sistem.AppDomain.ExecuteAssembly(String assemblyFile, Bukti assemblySecurity, String[] args) di Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() di Sistem.Threading.ThreadHelper.ThreadStart_Context(Object state) di Sistem.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Obyek negara, Boolean preserveSyncCtx) di Sistem.Threading.ExecutionContext.Menjalankan(ExecutionContext executionContext, ContextCallback callback, Obyek negara, Boolean preserveSyncCtx) di Sistem.Threading.ExecutionContext.Menjalankan(ExecutionContext executionContext, ContextCallback callback, negara Objek) di Sistem.Threading.ThreadHelper.ThreadStart() InnerException: Ini adalah diperbarui Buah kelas:
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
}
}
Diperbarui MainWindows xaml (untuk menambahkan tombol simpan)
<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>
dan saya kode di belakang mainwindows (menambahkan handler)
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;
}
}
}
Saya baru ditambahkan dbContext:
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");
}
}
}
Kelas-kelas lain tetap tidak berubah, tapi saya tercantum pula: 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
}
Aplikasi.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>
Struktur proyek saya Saya tabel di 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]
Mohon saran kenapa pesan yang mengatakan tidak ada primary key saat itu tidak ada
Pengecualian ini pesan doesn't berarti memerlukan sebuah kunci utama untuk menjadi yang ditetapkan dalam database, itu berarti membutuhkan sebuah kunci utama untuk menjadi yang ditetapkan dalam kelas.
Meskipun anda've mencoba untuk melakukannya:
pribadi Guid _id; [Kunci] publik Guid ID { get { return _id; } }
Ini tidak memiliki efek, seperti Entity Framework mengabaikan properti hanya-baca. Itu: ketika mengambil sebuah Buah-buahan
record dari database, itu membangun Buah
objek, dan kemudian memanggil properti setter untuk masing-masing properti dipetakan. Yang's tidak akan pernah bekerja untuk properti hanya-baca.
Anda perlu Entity Framework untuk dapat menetapkan nilai ID
. Ini berarti properti harus memiliki setter.
Saya datang ke sini dengan kesalahan yang sama:
System.InvalidOperationException: 'jenis entitas 'MyType' membutuhkan kunci utama untuk menjadi yang ditetapkan.'
Setelah membaca jawaban oleh hvd, menyadari bahwa aku hanya lupa untuk membuat kunci tamu 'umum'. Ini..
namespace MyApp.Models.Schedule
{
public class MyType
{
[Key]
int Id { get; set; }
// ...
Harus ini..
namespace MyApp.Models.Schedule
{
public class MyType
{
[Key]
public int Id { get; set; } // must be public!
// ...
Properti Id anda perlu memiliki setter. Namun setter dapat secara pribadi.
The [Key]
atribut ini tidak diperlukan jika properti yang bernama "Id" karena akan menemukannya melalui konvensi penamaan di mana tampak sebuah key dengan nama "Id".
public Guid Id { get; } // Will not work
public Guid Id { get; set; } // Will work
public Guid Id { get; private set; } // Will also work
Saya menemukan sedikit berbeda penyebab kesalahan. Sepertinya SQLite ingin menggunakan yang benar primary key properti kelas nama. Jadi...
Salah PK nama
public class Client
{
public int SomeFieldName { get; set; } // It is the ID
...
}
Benar PK nama
public class Client
{
public int Id { get; set; } // It is the ID
...
}
public class Client
{
public int ClientId { get; set; } // It is the ID
...
}
Masih posible untuk menggunakan salah PK nama tapi kita harus menggunakan [Key] atribut seperti
public class Client
{
[Key]
public int SomeFieldName { get; set; } // It is the ID
...
}
jenis entitas 'DisplayFormatAttribute' membutuhkan kunci utama untuk menjadi didefinisikan.
Dalam kasus saya, saya tahu masalahnya adalah bahwa saya digunakan properties seperti ini:
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
Tidak yakin jika ada cara yang lebih baik untuk memecahkan hal itu, tapi saya merubah Email dan PhoneNumber atribut ke string. Masalah diselesaikan.