熟悉Entity framework的速来救命!

zhangtianxing007 2012-10-08 10:16:45
我有一个对象Atlas,包含另一个对象Customers.既Customers集合是Atlas的一个属性。我在窗体加载的时候把所有Customer取出来,绑定到combobox.datasource上。
combobox1.DataSource = customers;
然后我有一个按钮,当我点击的时候就把选中的selectedItem放到一个IList<Customer>里,变量名假定是ss.

然后我封装atlas对象,让atlas.customers = ss;

提交之后却发现表中新增了我选定的SS。而不是引用关系。我的理解是Customer被当做新对象处理了。我该怎么做才能“引用”。而不是NEW一个新的Customer出来。

求高人指点啊。和Entry.Status有关系吗?正确的status应该是什么呢?还是说我绑定到combobox的时候这个对象就被认为是新的了?我应该如何做,谢谢。
...全文
161 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangtianxing007 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你的 Altas 和Curstomers之间已经建立的联系 EF 实体操作的时候 他们在SaveChanges()之前是不会提交数据库的 你在Altas的属性上附上了一个Curstomers的 值 而又执行的是Add操作 他不仅会添加Altas数据 同时会把增添 Altas上关联的属性(即数据中存在的表)不为null的数据也会添加到数据库中 这时候 你如果不想添加附属的属性 ……
[/Quote]
是这样的,
public bool Add(AnyMeter anyMeter,User user)
{
using (ModelContextContainer cc= new ModelContextContainer())
{
anyMeter.User = user;
cc.AnyMeters.Add(anyMeter);
return cc.SaveChanges() == 1 ? true : false;
}
}

比如说这个方法,user是一个在数据库中已经存在的对象。我是想把已经在方法外部包装的好的anymeter提交到数据库,同时,anyMeter与这个user建立联系。可是结果却是,anymeter被保存到数据库,且同时与user建立了联系,但是,这个user不是我之前存在的USER,它又弄了一个新的到数据库去,anymeter引用的是这个新生成的user。 我该怎么办?
  • 打赏
  • 举报
回复
你的 Altas 和Curstomers之间已经建立的联系 EF 实体操作的时候 他们在SaveChanges()之前是不会提交数据库的 你在Altas的属性上附上了一个Curstomers的 值 而又执行的是Add操作 他不仅会添加Altas数据 同时会把增添 Altas上关联的属性(即数据中存在的表)不为null的数据也会添加到数据库中 这时候 你如果不想添加附属的属性 你就不要给他们赋值 添加之后会用到 建议添加后在复制 EF他是会在实体上添加标记的 你的任何操作标记他都会记录下来 当你执行SaveChanges的时候 他自然会把所有的标记都执行掉。建议 :你的问题不仅要说问题 还要简要说一下需求 这样有助于别人帮你解决问题
zhangtianxing007 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

无代码无真相。你是怎么修改的,又是怎么提交的?
你的数据有没有主键?
[/Quote]

//COMBOBOX的displaymember是name,valuemember是ID
//绑定
combobox.DataSource = sdfdf.ToList();//假设sdfsdf就是我查询出来的所有的Customer集合吧。
IList<Customer> ss = new List<Customer>();
//我选择一个Customer的时候,就让
ss.Add((Customer)combobox.selectedItem); //这里必须强转,估计这里出的问题
Altas a = new Altas();
//提交前一大堆赋值操作
a.Customers = ss;//给altas.customer赋值。
using(ModelContex mc = new ModelContext())
{
mc.Altas.Add(a);
mc.SaveChanges();
}
我记忆中就是这种思路吧。大婶们救命啊 呜呜。以前用nhibernate这样做是没有问题的。

zhangtianxing007 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

无代码无真相。你是怎么修改的,又是怎么提交的?
你的数据有没有主键?
[/Quote]
我在load的时候绑定了所有customer到combobox的datasource,这是前提。
代码在办公室里,我并没有修改,Customer和atlas是多对多,我只是希望当我把Customer集合赋值给Atlas的时候,在表中反应出来是这样的
AtlasID 其余属性
1 XXXXXXX


CustomerID 其余属性
1 XXXXXXX
2 XXXXXXXX
3 XXXXXXXXX

AtlasID CustomerID
1 1
1 2

那么意味着Customer1和2是Altas1的属性


现在的问题是当我把selectedItem添加到Altas的集合中时,在Customer表中会多新建几条Customer出来。。。。。。 就跟我不是用selectedItem找出来的一样。到底是哪里错了。通常在new Customer()这种操作的时候才能这样。
刚才我想里一样,可能是我在取对象的时候不能直接用selectedItem吧.也许应该这样做,combobox.item[combobox.selectedIndex].明天去试试吧只能。不过我感觉一样会出错。我想我绑定的集合中的对象与我取出来的对象应该不是同一个。哎 ,到底该怎么搞?难道要封装Atlas前根据选到的ID重新去查一次,那我就崩溃了……
caoqinghua 2012-10-08
  • 打赏
  • 举报
回复
把对象Atlas弄个变量存起来.
devmiao 2012-10-08
  • 打赏
  • 举报
回复
无代码无真相。你是怎么修改的,又是怎么提交的?
你的数据有没有主键?

110,896

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧