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

这是我的添加商店按钮:

    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

这里真正的问题是您的数据模型。

在任何情况下,您正在重新创建在实例化新 Storage 实例时已经存在的 User 实体。存储从用户继承,因此存储在概念上用户的一个实例。然而,存储模型是不同的——存储是用户和存储之间的关系表。

通过实例化一个新的 Storage 实例,将现有 User 对象的属性复制到 Storage 实例的基本属性,然后简单地将 Storage 对象附加到 Users DbSet,实体框架正确地认为该对象是新的并且需要插入 - 包括用户实体对象。用户记录已经存在,因此您的重复密钥问题。

解决方案:更改您的数据模型。没有理由拥有 1..1 关系实体“存储”。只需在 User 实体中创建一个可为空的 Store 属性。如果您想强制 Store 的实例只能由单个用户引用,则 Store 实体应使用 User.Id 属性作为其主键(具有 FK 关系)或在 Store 中有一个 FK UserId 属性必须是唯一的。

于 2013-03-25T21:38:13.347 回答