【问题标题】:Entity Framework and adding a reference / entry to a lookup table实体框架并向查找表添加引用/条目
【发布时间】:2013-06-24 08:59:33
【问题描述】:

我有一个项目,我使用查找表将两个表链接在一起:

Day         WeatherLookUp       Weather
---         -------------       -------    
ID (PK) --> DayID            |- ID (PK)
            WeatherID    <---|  Description

这允许我指定一天的多个天气条件。

我可以毫无问题地从中阅读,但我的问题是当我在 Day 和 Weather 表之间插入链接时。我创建了 WeatherLookup 表的两列作为表的复合主键,因此 EF 不允许我直接插入 WeatherLookup 表。

我以为我只需要像这样添加一个天气条目:

myDay.Weather.Add(new Weather { ID = 2 } );

...但是 EF 认为我正在尝试添加新的天气类型。

我确定我遗漏了一些明显的东西,但我不知道是什么,我需要以某种方式使用 Attach() 吗?

【问题讨论】:

  • 是的,你需要使用Attach

标签: c# entity-framework entity-framework-4 lookup


【解决方案1】:

您需要将 Weather 实体附加到上下文中,以便告诉 EF 它已经存在于数据库中并且不需要插入:

var weather = new Weather { ID = 2 };
context.Weather.Attach(weather);
myDay.Weather.Add(weather);

或者,您可以从数据库中加载实体(这会将其隐式附加到上下文中):

var weather = context.Weather.Find(2);
myDay.Weather.Add(weather);

【讨论】:

  • +1 完美,我自己也遇到了这个问题,然后开始加载实体,因此它们在上下文中,但是 Attach 是一个更好的方法,因为它不需要对数据库进行额外的查询。跨度>
【解决方案2】:

您需要将“Weather”与“WeatherLookUp”相关联,而不仅仅是使用 ID。

类似这样的:

Weather weather = new Weather();
weather.Description = "hi";


WeatherLookUp lookup = new WeatherLookUp ();
lookup.Weather = weather;

myDay.Weather.add(Weather);
myDay.WeatherLookUp.add(lookup);
myDay.SaveChanges();

【讨论】:

  • 感谢您的回答 - 我无法创建 WeatherLookUp 的实例,因为 DbContext 没有公开它,只有 Day 和 Weather 可见。
  • 它没有被暴露,因为它没有PK,只有FK。您可以创建一个自动增量的 pk,您将能够看到它。
  • 谢谢,我可以更改数据库设计以添加自动增量列,但我希望有另一种解决方法。 EF 在这种情况下不能很好地处理复合键,这似乎很奇怪。
  • 是的,这真的很奇怪,但据我所知,所有带有 EF 的表都需要有一个 PK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多