Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 保存更改时以一对一关系复制记录_Entity Framework - Fatal编程技术网

Entity framework 保存更改时以一对一关系复制记录

Entity framework 保存更改时以一对一关系复制记录,entity-framework,Entity Framework,我在两个实体之间有一对一的关系,我想在我的表中设置导航属性添加重复记录 因为我的英语很差,我为你附上我的项目 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;

我在两个实体之间有一对一的关系,我想在我的表中设置导航属性添加重复记录

因为我的英语很差,我为你附上我的项目

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; }
}
这里是我的Add Store botton:

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

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

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

通过实例化一个新的存储实例,将现有用户对象的属性复制到存储实例的基本属性,然后简单地将存储对象附加到用户数据库集,entity framework正确地认为该对象是新的,需要插入—包括用户实体对象。用户记录已存在,因此存在重复密钥问题


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

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

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

通过实例化一个新的存储实例,将现有用户对象的属性复制到存储实例的基本属性,然后简单地将存储对象附加到用户数据库集,entity framework正确地认为该对象是新的,需要插入—包括用户实体对象。用户记录已存在,因此存在重复密钥问题


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

我建议您至少尝试用一些代码段描述问题。如果显示相关的代码片段(实体类、导致重复的代码等),几乎不需要英语。您是否覆盖了
Store.Equals
Store.GetHashCode
?我不明白你怎么会收到“复制错误”的信息<将在新上下文中加载
foreach
循环中的code>item<代码>此来自上下文之外。它们必须是不同的对象,并且
存储。如果未被覆盖,Equals
将按对象引用进行检查。是的,我覆盖了Equal方法,但我的问题是关于在数据库中设置Store.Storage时的重复存储。不管怎样,您能否显示
存储.Equals
用户中的
等于
还是
存储中的
也被覆盖?如果是,请也显示该方法(您可以单击问题下的“编辑”链接并添加更多代码)。否,我为Store覆盖Equal方法,为User覆盖Equal方法,否,为什么我需要覆盖Equal方法,您可以下载我的Proect并查看。我鼓励您至少尝试用一些代码片段描述问题。如果显示相关的代码片段(实体类、导致重复的代码等),几乎不需要英语。您是否覆盖了
Store.Equals
Store.GetHashCode
?我不明白你怎么会收到“复制错误”的信息<将在新上下文中加载
foreach
循环中的code>item
<代码>此
来自上下文之外。它们必须是不同的对象,并且
存储。如果未被覆盖,Equals
将按对象引用进行检查。是的,我覆盖了Equal方法,但我的问题是关于在数据库中设置Store.Storage时的重复存储。不管怎样,您能否显示
存储.Equals
用户中的
等于
还是
存储中的
也被覆盖?如果是,请也显示该方法(您可以单击问题下的“编辑”链接并添加更多代码)。否,我为商店覆盖了Equal方法,为用户覆盖了Equal方法,为什么我需要覆盖Equal方法,您可以下载我的Proect并查看ittnx以获得答案,但是我从用户那里继承了几个类,例如:accountary和Admin。如果我在用户和存储之间创建一个关系,例如管理员可以在存储中插入。存储和这个问题与OO编程相匹配??你能给我一个更好的解决方案吗?我不太明白你在说什么。。。您不希望从用户派生的某些实体具有存储属性吗?如果是这样,管理员应该直接从用户派生;存储应该从用户派生,并且当前从用户派生的、希望访问存储属性的任何实体都应该从存储派生。TPT的有趣应用。。。这就是你想要的吗?tnx是你的答案,但我有几个类是从用户那里继承的,比如:会计和管理员。如果我在用户和商店之间建立关系,例如管理员可以在商店中插入。存储和这个问题与OO编程相匹配??你能给我一个更好的解决方案吗?我不太明白你在说什么。。。您不希望从用户派生的某些实体具有存储属性吗?如果是这样的话,管理员应该