2017-04-19 65 views
3

我想給它的能力,以持續的數據擴展要求在此線程錯誤:實體類型需要主鍵

Binding listbox to observablecollection

的問題。除了我安裝的Entity Framework Core之外,結構大部分是相同的,創建了一個DbContext類來保存記錄。我添加了一個按鈕將數據集保存到SQL Server。我沒有遇到編譯錯誤,但是當我試圖將數據保存在數據庫中,我得到這個運行時異常:

Message=The entity type 'Fruit' requires a primary key to be defined.

在整體上可整個異常如下

System.InvalidOperationException was unhandled
HResult=-2146233079
Message=The entity type 'Fruit' requires a primary key to be defined.
Source=Microsoft.EntityFrameworkCore
StackTrace:
at Microsoft.EntityFrameworkCore.Internal.ModelValidator.ShowError(String message)
at Microsoft.EntityFrameworkCore.Internal.ModelValidator.EnsureNonNullPrimaryKeys(IModel model)
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 Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.<>c__DisplayClass14_0.b__0(Object k)
at System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 valueFactory)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
at 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
2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, 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.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
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
1 accessor)
at Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.get_StateManager()
at Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.DetectChanges()
at Microsoft.EntityFrameworkCore.DbContext.TryDetectChanges()
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
at Fruits.MainWindow.SaveFruitCommandBinding_Executed(Object sender, ExecutedRoutedEventArgs e) in D:\Frank\Test\Fruits\Fruits\MainWindow.xaml.cs:line 50
at System.Windows.Input.CommandBinding.OnExecuted(Object sender, ExecutedRoutedEventArgs e)
at System.Windows.Input.CommandManager.ExecuteCommandBinding(Object sender, ExecutedRoutedEventArgs e, CommandBinding commandBinding)
at System.Windows.Input.CommandManager.FindCommandBinding(CommandBindingCollection commandBindings, Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
at 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(Object sender, ExecutedRoutedEventArgs e) at System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler(Delegate genericHandler, Object target) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) at System.Windows.Input.RoutedCommand.ExecuteImpl(Object parameter, IInputElement target, Boolean userInitiated) at System.Windows.Input.RoutedCommand.ExecuteCore(Object parameter, IInputElement target, Boolean userInitiated) at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) at System.Windows.Controls.Primitives.ButtonBase.OnClick() at System.Windows.Controls.Button.OnClick() at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e) at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e) at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) at System.Windows.Input.InputManager.ProcessStagingArea() at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) at System.Windows.Application.RunDispatcher(Object ignore) at System.Windows.Application.RunInternal(Window window) at System.Windows.Application.Run(Window window) at System.Windows.Application.Run() at Fruits.App.Main() at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:

這是上市更新後的類水果:

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 
    } 
} 

更新MainWindows XAML(可添加一個保存按鈕)

<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> 

和mainwindows後面我的代碼(添加處理器)

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; 
     } 
    } 
} 

我新加入的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"); 
     } 
    } 
} 

其他類保持不變,但我列出了他們無論如何:

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> 

我的項目結構

enter image description here

我在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] 

請告知爲什麼消息說,有沒有主鍵雖然它確實存在

回答

26

This exce這並不意味着它需要在您的數據庫中定義主鍵,這意味着它需要在您的中定義主鍵。

雖然你已經嘗試這樣做:

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

這有沒有影響,因爲實體框架忽略只讀屬性。它必須:當它從數據庫中檢索Fruits記錄時,它會構造一個Fruit對象,然後爲每個映射的屬性調用屬性設置器。這永遠不會用於只讀屬性。

您需要實體框架才能設置值爲ID。這意味着該物業需要有一名籌款人。

+0

謝謝!我會試一試,讓你知道。非常感謝!!! – user1205746

+0

就是這樣!你建議修正錯誤。但是,你可以建議我會如何彌合數據,以便從的ObservableCollection 數據可以被傳遞到DbSet ?有沒有比以某種方式完成DbSet 的作業更好的方法? – user1205746

+1

@ user1205746'DbSet .Local'應該是一個'的ObservableCollection '可以綁定到。它跟蹤加載到上下文中的所有實體。然後(或之前),只是確保你的實體加載到上下文('context.Fruits.Load();'),它應該工作。這要求您保持環境至少與視圖模型一樣長。對於情境應該是短命的還是長壽的,意見各不相同。就個人而言,在這種情況下,我會選擇一個長期的背景。 – hvd

1

我來到這裏有類似的錯誤:

System.InvalidOperationException: 'The entity type 'MyType' requires a primary key to be defined.'

通過HVD閱讀的答案後,意識到我只是忘了讓我的主要屬性爲「公開」。這..

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

     // ... 

應該是這樣..

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

     // ... 
相關問題