我有两个实体之间的一对一关系,我想要设置导航属性添加重复记录tu table
因为我的英语很差,我为你附上我的项目Here
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;
}
}
答案 0 :(得分:1)
这里真正的问题是你的数据模型。
在任何情况下,正在发生的是您正在重新创建实例化新存储实例时已存在的用户实体。存储继承自用户,因此存储 是概念上的用户实例。但是,存储模型不同 - 存储是User和Store之间的关系表。
通过实例化一个新的Storage实例,将现有User对象的属性复制到Storage实例的基本属性,然后简单地将Storage对象附加到Users DbSet,实体框架正确地认为该对象是新的并且需要是inserted - 包括User实体对象。用户记录已存在,因此您的重复密钥问题。
解决方案:更改您的数据模型。没有理由让1..1关系实体“存储”。只需在User实体中创建一个可为空的Store属性。如果要强制实施Store实例只能由单个用户引用,则Store实体应使用User.Id属性作为其主键(具有FK关系)或在Store中具有FK UserId属性。必须是独一无二的。