.Include Заставляет EF бросать последовательность, не содержащую элементов - PullRequest
1 голос
/ 25 января 2011

существующих таблиц SQL Server

Два теста:

Назовите это A:

    [Test]
    public void AssertAccessPolicyWithIdAndChecksum()
    {
        var pol = Repo.GetPolicyFlightStatus(aut_id: 44544, checksum: "QXSDENY");
        Assert.NotNull(pol);
    }

Назовите это B

    [Test]
    public void AssertGetFriendlyPolicy()
    {
        var lineRepo = new tbl_StatusRepository();
        var pol = Repo.GetPolicyFlightStatus(aut_id: 44544, checksum: "QXSDENY");
        Assert.AreEqual("With Underwriter", pol.tbl_Status.txt_friendlyName);
        Assert.AreEqual("WC/Longshore", pol.tbl_Line.txt_friendlyName);
    }

Модели:

public partial class tbl_Policy
{
    [Key]
    public int aut_id { get; set; }
    [ForeignKey("tbl_Status")]
    public int int_statusID { get; set; }
    public virtual tbl_Status tbl_Status { get; set; }
    [ForeignKey("tbl_Line")]
    public int int_lineID { get; set; }
    public virtual tbl_Line tbl_Line { get; set; }
}

public class tbl_Status
{
    [Key]
    public int aut_id { get; set; }
    public string txt_status { get; set; }
    public string txt_friendlyName { get; set; }
    public virtual tbl_Policy tbl_Policy { get; set; }
}

public class tbl_Line
{
    [Key]
    public int aut_id { get; set; }
    public string txt_Line { get; set; }
    public string txt_friendlyName { get; set; }
    public virtual tbl_Policy tbl_Policy { get; set; }
}

при запуске

      internal static tbl_Policy GetPolicyFlightStatus(int aut_id, string checksum)
    {
        if (Transcoder.Transcode(aut_id) == checksum)
        {
            var ctx = new LIGDataContext();
            return ctx.tbl_Policy.Include("tbl_Line").Include("tbl_Status").Single(f => f.aut_id == aut_id);
        }
        return null;
    }

TestA проходит тестBB выдает исключение в первой строке подтвержденияДобавление включений для подтаблиц

 internal static tbl_Policy GetPolicyFlightStatus(int aut_id, string checksum)
    {
        if (Transcoder.Transcode(aut_id) == checksum)
        {
            var ctx = new LIGDataContext();
            return ctx.tbl_Policy.Include("tbl_Line").Include("tbl_Status").Single(f => f.aut_id == aut_id);
        }
        return null;
    }

Тест A и бросок B LIG2010RedesignMVC3.LIGMVC2010FlightTrackerTests.AssertAccessPolicyWithIdAndChecksum: System.InvalidOperationException: последовательность не содержит элементовLIG2010RedesignMVC3.LIGMVC2010FlightTrackerTests.AssertGetFriendlyPolicy: System.InvalidOperationException: последовательность не содержит элементов

Ответы [ 2 ]

1 голос
/ 25 января 2011

Мне также пришлось переделать моё моделирование (благодарность Мортезе, но я хотел, чтобы это было здесь для моих записей

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<tbl_Line>()
            .HasMany(d => d.tbl_Policy)
            .WithRequired(c => c.tbl_Line)
            .HasForeignKey(c => c.int_lineID);
        modelBuilder.Entity<tbl_Status>()
            .HasMany(d => d.tbl_Policy)
            .WithRequired(c => c.tbl_Status)
            .HasForeignKey(c => c.int_statusID);
    }
1 голос
/ 25 января 2011

Есть некоторые проблемы в вашей объектной модели.По сути, вы пытаетесь установить связь 1: 1 с внешними ключами, в то время как код сначала не поддерживает этот сценарий.В результате он превращает все ваши ассоциации в Ассоциации общих первичных ключей, и ни один из внешних ключей в tbl_Policy не становится внешним ключом в базе данных.Во-первых, вам нужно исправить вашу модель, так как это может вызвать кучу исключений во время выполнения.

В настоящее время существует два способа сопоставить связь 1: 1 в Code-First:
1.Ассоциации общего первичного ключа
2.Индивидуальные ассоциации внешних ключей

Посмотрите, какая из них лучше описывает вашу модель домена, и я могу изменить вашу объектную модель, чтобы она соответствовала этому.

...