实体框架6 - 0..1 RelationShip Mapping

时间:2014-03-21 19:32:47

标签: c# entity-framework entity-relationship

我有两个班级:

public class Report
{
    public int IdReport {get;set;}

    public int IdModel {get;set;}

    public Model MyModel {get;set;}
}

public class Model
{
    public int IdModel {get;set;}

    public Report MyReport {get;set}
}

我有这个配置类:

public class ReportConfiguration : EntityTypeConfiguration<Report>
{
     HasOptional(c => c.Model).WithOptionalPrincipal(d => d.Report)....
}

这是我卡住的地方,怎样才能获得HasForeignKey(c =&gt; c.IdModel)配置

我需要这个,因为我们有一个使用绑定源的表单,报表可以有或没有模型(因为我们制作动态报表)。

我不想创建一个伪外键,比如创建属性和报表插入,我使用模型中的主键设置此属性值。这是我发现用正确的值填充bindingsource以与组合框值编辑绑定的方法。

我看到导航属性MyModel.IdModel可以提供这种功能,但绑定源是否可以实现这种方法?

2 个答案:

答案 0 :(得分:0)

我不确定这正是您所需要的,但这将创建一个可以从“报告”到“模型”的可空外键关系,反之亦然:

public class Report
{
    public int ReportId { get; set; }

    public int? ModelId { get; set; }

    public Model Model { get; set; }
}

public class Model
{
    public int ModelId {get; set;}

    public Report Report { get; set; }

    public int ReportId { get; set; }
}

public class ReportConfiguration : EntityTypeConfiguration<Report>
{
    public ReportConfiguration()
    {
        this.ToTable("Report");

        this.HasOptional(m => m.Model).WithMany().HasForeignKey(m => m.ModelId).WillCascadeOnDelete(false);
    }
}

希望它有所帮助。

答案 1 :(得分:0)

通过映射,Report是主要实体,这意味着Model具有外键。因此,无论如何,您都无法在ModelId中设置Report。您必须设置Model

从技术上讲,这不是什么大问题。您可以使用Models填充组合框(或绑定源),而不是设置ValueMember并绑定SelectedItem

在性能方面,它可能并不重要,除非Model具有非常宽的记录,并且您只想选择其Id和Name属性。现在你必须从数据库中获取完整的对象。

我一直想知道为什么1-1 API不允许定义外键关联(即引用和原始外键对),但强制您使用独立关联(仅参考)。到目前为止,原因尚不清楚。我认为,在这种情况下,Model可能在类模型中暴露了ReportId