Entity framework 保存更改时以一对一关系复制记录
我在两个实体之间有一对一的关系,我想在我的表中设置导航属性添加重复记录 因为我的英语很差,我为你附上我的项目 tnx 我的代码在这里: 这里是我的实体: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;
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编程相匹配??你能给我一个更好的解决方案吗?我不太明白你在说什么。。。您不希望从用户派生的某些实体具有存储属性吗?如果是这样的话,管理员应该