0

EF 4.3.1 で entities.savechanges() を呼び出すとエラーが発生します。私のデータベースは sql ce v4 ストアで、mvvm パターンでコーディングしています。監視可能なコレクションに送信して変更などを行うコンテキストのローカル バージョンがあります。これは正常に機能し、データベースに行が存在しないときに savechanges() を呼び出すと、オブジェクトは正常に保持されます。アプリケーションをリロードすると、オブジェクトがリストボックスに表示されますが、別のオブジェクトを追加して savechanges() を呼び出すと、一意のインデックスに重複する値を挿入できないというエラーが表示されます。

私の理解では、コンテキストがエンティティをデータストアに保存しようとしていることを意味しますが、元のオブジェクトと新しいオブジェクトを追加しているようです。彼らの状態は変わらないので、彼らを放っておくと思いました。

private void Load()
    {
        entities.Properties.Include("Images").Load();
        PropertyList = new ObservableCollection<Property>();
        PropertyList = entities.Properties.Local;        

        //Sort the list (based on previous session stored in database)
        var sortList = PropertyList.OrderBy(x => x.Sort).ToList();
        PropertyList.Clear();
        sortList.ForEach(PropertyList.Add);

        propertyView = CollectionViewSource.GetDefaultView(PropertyList);
        if (propertyView != null) propertyView.CurrentChanged += new System.EventHandler(propertyView_CurrentChanged);     


        private void NewProperty()
    {
        try
        {
            if (PropertyList != null)
            {                                             
                Property p = new Property()
                    {
                        ID = Guid.NewGuid(),
                        AgentName = "Firstname Lastname",
                        Address = "00 Blank Street",
                        AuctioneerName = "Firstname Lastname",
                        SaleTitle = "Insert a sales title",
                        Price = 0,
                        NextBid = 0,
                        CurrentImage = null,
                        Status = "Auction Pending",
                        QuadVis = false,
                        StatVis = false, //Pause button visibility
                        Sort = PropertyList.Count + 1,                            
                    };

                PropertyList.Add(p);
                SaveProperties();
            }

        private void SaveProperties()
    {
        try
        {               
            foreach (var image in entities.Images.Local.ToList())
            {
                if (image.Property == null)
                    entities.Images.Remove(image);
            }                
        }

        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message);
        }

        entities.SaveChanges();
    }
4

2 に答える 2

1

ここですべてのコードについてコメントすることなく、これはあなたが提起した特定の問題を引き起こしているビットです:

//Sort the list (based on previous session stored in database) 
var sortList = PropertyList.OrderBy(x => x.Sort).ToList(); 
PropertyList.Clear(); 
sortList.ForEach(PropertyList.Add); 

このコード:

  • クエリが実行され、変更されていないエンティティとしてコンテキストによって追跡されているエンティティから開始します。つまり、データベースに既に存在することがわかっているエンティティです。
  • これらのエンティティの新しいソート済みリストを作成します。
  • ローカル コレクションで Clear を呼び出すと、追跡対象の各エンティティが削除済みとしてマークされ、コレクションから削除されます。
  • 各エンティティをコンテキストに追加して追加状態にします。これは、それが新しく、SaveChanges が呼び出されたときにデータベースに保存されることを意味します。

これで、データベースに存在するすべてのエンティティが実際には存在せず、保存する必要があることを EF に伝えることができました。したがって、これを実行しようとすると、表示される例外が発生します。

これを修正するには、DbContext ローカル コレクションをクリアせず、エンティティを再度追加します。代わりに、ローカル コレクションを使用してビューを並べ替える必要があります。

于 2012-04-27T13:51:41.957 に答える
1

既存のエンティティをアタッチする (既存の変更されていないものとしてマークする) のではなく、既存のエンティティをコンテキストに追加する (挿入するようにマークする) ように思えます。

また、新しい Guid() が同じ GUID を返していないこともわかりません...私は常に Guid.NewGuid() http://msdn.microsoft.com/en-us/library/system.guid.newguidを使用します.aspx

于 2012-04-27T05:06:58.300 に答える