【发布时间】:2013-04-19 08:12:18
【问题描述】:
我目前遇到了一个问题,我搜索了堆栈溢出高低似乎没有解决方案。我觉得我一定做错了什么,但希望有人能提供帮助。
反正我有以下型号:
public abstract class IDObject
{
[Key]
public Guid ID { get; set; }
}
public class TV : IDObject
{
public TV()
{
this.Channels = new List<Channel>();
}
public string Name { get; set; }
public virtual IList<Channel> Channels { get; set; }
}
public class Channel : IDObject
{
public string Name { get; set; }
public int Number { get; set; }
[Navigational]
public virtual IList<TV> TVs { get; set; }
}
电视 - 频道应该是多对多的关系。
现在基本上我希望能够将电视和频道添加到数据库,处理上下文,让电视引用之前添加的频道,然后更新数据库实体。
类似:
TV someTV = new TV() { ID = Guid.NewGuid(), Name = "myBigTV" };
Channel chan1 = new Channel() { ID = Guid.NewGuid(), Name = "CBC", Number = 3};
using (ReferenceContext context = new ReferenceContext())
{
context.TVs.Add(someTV);
context.Channels.Add(chan1);
context.SaveChanges();
}
someTV.Name = "myBigTV updated";
someTV.Channels.Add(chan1);
using (ReferenceContext context = new ReferenceContext())
{
context.TVs.Attach(someTV);
context.Entry(someTV).State = EntityState.Modified;
*** some code here ***
context.SaveChanges();
}
当我这样做时,我的 someTV 实体会更新,但当我在数据库中执行“查找”调用时,它仍然没有对 Channels 的引用。
现在我已经在 DbCollectionEntry 上为 Channels 尝试了 .Load()。我尝试在上下文中从 someTV 中删除所有对频道的引用,然后重新添加它们。我尝试将我从 someTV 引用的频道上的 EntityState 更改为 Modified... 似乎没有任何效果。
我首先使用代码,数据库正在为我创建以下表格:
Channels
ChannelTVs
TVs
频道和电视看起来都不错,但无论我做什么,我的连接表“ChannelTVs”总是空的。
问题一:在这种情况下更新关联的标准方法是什么。我不需要自己更新频道,只需从连接表中添加/删除实体即可。我是否需要在 fluent API 中添加一些内容来为我获取这些更改?
问题二:有没有办法以通用的方式做到这一点?我当前的更新看起来像:
void Update<TDatabase>(IDatabaseContext context, TDatabase item)
{
IDbSet<TDatabase> dbSet = context.GetDbSet<TDatabase>();
dbSet.Attach(item);
context.Entry(item).State = EntityState.Modified;
context.SaveChanges();
}
我知道以前有人问过这样的问题,但似乎没有一个解决方案有效。这可能是我做错了什么,或者只是一个特殊情况......
谢谢。
【问题讨论】:
-
为了我们的应用程序,实体需要在上下文之外进行初始更新。该实体实际上是在应用程序之外更新的,并通过我们的 REST 引擎送回并通过 JSON 反序列化。
标签: .net database entity-framework