集合的流畅配置和相同类型的单个属性

时间:2013-11-12 13:32:52

标签: c# ef-code-first

我有2个类,Type A有一个Type B的实例以及Type B的集合。我尝试了各种配置,但我似乎无法让它正常工作。如果你能向我解释我做错了什么,或者给我一个有用的资源。我对这些映射越来越好,但是现在它们显然超出了我的理解范围。我已经将课程范围缩小到了重要的属性。

澄清

只有一个与申请人相关的抽奖活动,申请人虽然会位于申请人的集合中,但是获奖作品将在WinnerId字段中填入ID,我希望EF能够映射到正确的申请人。

错误

在'NPlay.Common.Models.SweepstakesApplicant'类型上声明的导航属性'Sweepstakes'已经配置了冲突的映射信息。

public SweepstakesConfiguration()
{
    Property(c => c.Id).HasColumnName("SweepstakesId");

    HasMany(c => c.Applicants)
        .WithRequired(c => c.Sweepstakes)
        .HasForeignKey(c => c.SweepstakesId);

    HasOptional(c => c.WinningApplicant)
        .WithRequired(c => c.Sweepstakes)
        .Map(c => c.MapKey("WinnerId"));
}

public class SweepstakesApplicant
{
    public long Id { get; set; }        
    public int SweepstakesId { get; set; }
    public virtual Sweepstakes Sweepstakes { get; set; }
    public int BuyerId { get; set; }
    public virtual Buyer Buyer { get; set; }
    public int AgentId { get; set; }
    public virtual Agent Agent { get; set; }
}

映射

public SweepstakesConfiguration()
{
    Property(c => c.Id).HasColumnName("SweepstakesId");

    HasOptional(c => c.WinningApplicant)
        .WithRequired(c => c.Sweepstakes)
        .Map(c => c.MapKey("WinnerId"));
}

public SweepstakesApplicantConfiguration()
{
    Property(a => a.Id).HasColumnName("SweepstakesApplicantId");

    HasRequired(a => a.Sweepstakes)
            .WithMany(s => s.Applicants)
            .HasForeignKey(a => a.SweepstakesId)
            .WillCascadeOnDelete();

    HasRequired(c => c.Sweepstakes)
        .WithOptional(c => c.WinningApplicant)
        .Map(c => c.MapKey("SweepstakesId"));

    HasRequired(a => a.Buyer)
        .WithMany(b => b.SweepstakesApplications)
        .HasForeignKey(a => a.BuyerId);

    HasRequired(a => a.Agent)
        .WithMany()
        .HasForeignKey(a => a.AgentId);
}

编辑:更新了映射配置和错误。 编辑:进一步修正了标题,令我惊讶的是我收到了多少编辑,我想知道如果人们花更多的时间回答问题然后再进行编辑,这个网站是否会更好:D,嗯,这可能也会被编辑。

2 个答案:

答案 0 :(得分:0)

您在SweepstakesIdone to zero-or-one关系中使用相同的外键(one-to-many)。

在名为SweepstakesApplicant或类似的WinnerOfSweepstakes上创建一个集合,并说出hasMany,或者从映射中删除导航属性。

答案 1 :(得分:0)

这是我最终的配置。

    public SweepstakesConfiguration()
    {
        Property(c => c.Id).HasColumnName("SweepstakesId");

        HasOptional(c => c.WinningApplicant)
            .WithMany()
            .HasForeignKey(c => c.WinnerId);
    }

    public SweepstakesApplicantConfiguration()
    {
        Property(a => a.Id).HasColumnName("SweepstakesApplicantId");

        HasRequired(a => a.Sweepstakes)
            .WithMany(s => s.Applicants)
            .HasForeignKey(a => a.SweepstakesId)
            .WillCascadeOnDelete();

        HasRequired(a => a.Buyer)
            .WithMany(b => b.SweepstakesApplications)
            .HasForeignKey(a => a.BuyerId);

        HasRequired(a => a.Agent)
            .WithMany()
            .HasForeignKey(a => a.AgentId);
    }