1

2つのエンティティ間に1対1の関係があり、ナビゲーションプロパティを設定したい場合は、テーブルに複製レコードを追加します

私の英語が苦手なので、ここに私のプロジェクトを添付します

tnx

ここに私のコード:

ここに私のエンティティ:

public partial class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Lastname { get; set; }
    public int UserType { get; set; }
}

  public partial class Storage : User
{

    public virtual Store Store { get; set; }
}

public partial class Store
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual Storage Storage { get; set; }
}

ここに私のAddStoreボタン:

    User u = (User)(comboBox1.SelectedItem);
        Storage st = new Storage(u);
        Store s = new Store(textBoxStorename.Text);
        s.SetStorage(st);

        s.Save(st);

そしてここに私のストアクラス:

    public partial class Store
{

    public Store()
    {

    }


    public Store(string name)
    {

        this.Name = name;



    }

    public void SetStorage(Storage s)
    {
        if (s != null)
        {


            this.Storage = s;
        }

    }





    public void Save(Storage s)
    {


        using (var storekeeper = new TestContainer())
        {
            bool flag = false;
            foreach (var item in storekeeper.Stores)
            {
                if (item.Equals(this))
                {
                    flag = true;
                }
            }
            if (flag)
            {
                MessageBox.Show("Duplicat Error", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }



            try
            {



                storekeeper.Users.Attach(s);
                storekeeper.Stores.Add(this);

                storekeeper.SaveChanges();

            }
            catch (Exception e )
            {


                MessageBox.Show(e.Message);
            }




        }



    }







    public override string ToString()
    {
        return this.Name;
    }
}
4

1 に答える 1

1

ここでの本当の問題はデータモデルです。

いずれにせよ、何が起こっているのかというと、新しいストレージインスタンスをインスタンス化するときにすでに存在するUserエンティティを再作成しているということです。ストレージはユーザーから継承するため、ストレージ概念的にはユーザーのインスタンスです。ただし、ストレージモデルは異なります。ストレージは、ユーザーとストアの間の関係テーブルです。

Storageの新しいインスタンスをインスタンス化し、既存のUserオブジェクトのプロパティをStorageインスタンスのベースプロパティにコピーしてから、StorageオブジェクトをUsers DbSetにアタッチするだけで、エンティティフレームワークは、オブジェクトが新しく、挿入する必要があると正しく見なします。 Userエンティティオブジェクト。ユーザーレコードはすでに存在するため、キーの重複に問題があります。

解決策:データモデルを変更します。1..1関係エンティティ「ストレージ」を持つ理由はありません。Userエンティティにnull許容のStoreプロパティを作成するだけです。Storeのインスタンスを1人のユーザーのみが参照できるようにする場合、StoreエンティティはUser.Idプロパティを主キーとして使用するか(FK関係を使用)、StoreにFKUserIdプロパティを設定する必要があります。一意である必要があります。

于 2013-03-25T21:38:13.347 に答える