我在实体框架代码第一个模型中定义了1到0..1的关系,如下所示:
public class Album
{
public int AlbumId { get; set; }
public int StampId { get; set; }
public Stamp Stamp { get; set; }
// other properties
}
public class Stamp
{
public int StampId { get; set; }
public int AlbumId { get; set; }
[Required]
public Album Album { get; set; }
// other properties
}
所以..一张专辑有0..1枚邮票,一张邮票总是只有一张专辑。我在这里的配置工作得很好。但是,当我查看数据库中生成的列时,我有点不高兴:外键是在Album
表中创建的...这使得批量插入新邮票变得困难/缓慢,因为你总是需要改变Album
表并在那里更新StampId
外键。 (这意味着我需要更改跟踪以更改这些字段)
如何告诉Entity Framework在Stamp
表中创建外键?
我也不确定导航属性的声明在这个上下文中扮演什么角色..是否在两个方向都定义了这些属性是否重要?
答案 0 :(得分:1)
好的,我用我在这里找到的很好的例子来解决它:http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx
诀窍是使用'Stamps'表中的'AlbumID'外键作为主键。这意味着Stamp Ids将不是主键,并且主键将具有不存在的ID的“间隙”。换句话说,通过这样做,您可以保证一个相册只有一个印章。 由于这个概念有点刺激,one can still simulate一个UID'StampID',每当你添加一个新条目时它就会递增。
所以我的例子就是:
public class Album
{
public int AlbumId { get; set; }
public Stamp Stamp { get; set; }
// other properties
}
public class Stamp
{
[Index(IsUnique = true)] // another UID, just to follow the naming pattern
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int StampId { get; set; }
[Key, ForeignKey("Album")] // The PK, taken as FK from the associated Album
public int AlbumId { get; set; }
[Required] // the required attribute just makes validation errors more readable
public Album Album { get; set; }
// other properties
}