实体框架代码优先:1:0..1更改外键位置

时间:2016-04-20 11:22:34

标签: c# mysql entity-framework ef-code-first foreign-key-relationship

我在实体框架代码第一个模型中定义了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表中创建外键?

我也不确定导航属性的声明在这个上下文中扮演什么角色..是否在两个方向都定义了这些属性是否重要?

1 个答案:

答案 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
}