1到1与数据库生成的身份所需的关系

时间:2014-10-14 15:39:16

标签: c# entity-framework ef-code-first

我已经看到很多实现一对一关系的例子,但是我做错了,因为要求有些不同(Guid有数据库生成选项,外键属性等等。)

我有两个类别(Bundesland,Programmkonfiguration),它们具有1:1的关系(商业意义上都需要两端)但不能加入一个表

对Bundesland的要求:

  • Guid ID为密钥但没有DatabaseGenerated属性
  • 导航属性程序设计

Bundesland.cs:

public class Bundesland
{
    [Key]
    public Guid Id { get; set; }

    public virtual Programmkonfiguration Programmkonfiguration { get; set; }
}

对Bundesland的要求

  • Guid Id作为从数据库生成的密钥
  • ForeignKey Property Bundesland_Id(需要_用于界面)
  • 导航物业Bundesland

Programmkonfiguration.cs:

public class Programmkonfiguration
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public Guid Bundesland_Id { get; set; }

    public virtual Bundesland Bundesland { get; set; }
} 

数据库架构应如下所示

  • 表Bundesland(Id)
  • table Programmkonfiguration(Id,Bundesland_Id)

为什么我到现在为止失败了:

  • EF不会自己识别这种关系
  • 如果我使用任何属性(ForeignKey,必需)或流畅的API并且模式构建器未失败,则在context.SaveChanges()
  • 之后永远不会设置外键属性Programmkonfiguration.Bundesland_Id

如果您想帮助我,请参阅以下其他课程:https://gist.github.com/anonymous/9cb554cd864e3dbee1ac

我正在使用带有EF5的.NET 4.5(.1),但我也没能使用EF6

提前致谢:)

1 个答案:

答案 0 :(得分:0)

您可以使用流畅的配置:

public class Bundesland
{
    [Key]
    [ForeignKey("Programmkonfiguration")]
    public Guid Id { get; set; }

    public virtual Programmkonfiguration Programmkonfiguration { get; set; }
}

public class BundesLandConfiguration: EntityTypeConfiguration<Bundesland>
{
    public BundesLandConfiguration()
    {            
        HasProperty(p=>p.Id)
        HasRequired(p=>p.Programmkonfiguration).WithRequiredPrincipal(p=>p.Bundesland);
    }
}

public class Programmkonfiguration
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public Guid Bundesland_Id { get; set; }

    public virtual Bundesland Bundesland { get; set; }
}

public class ProgrammkonfigurationConfiguration: EntityTypeConfiguration<Programmkonfiguration>
{
    public ProgrammkonfigurationConfiguration()
    {
        HasKey(p=>p.Id);
        HasProperty(p=>p.Id)
        HasProperty(p=>p.Bundesland_Id)
    }
}

不要忘记将此配置添加到db context中的EntityModelConfigurations。

更新:因为属性命名违反了惯例,所以你应该添加[ForeignKey]属性,因为我添加到了Bundesland类的属性ID中。