Ich benutze Entity Framework 4.3.1 mit dem DbContext POCO-Ansatz gegen eine SQL Server 2012-Datenbank.Warum verhindert eine Datetime, dass eine Navigationseigenschaft geladen wird?
Ich habe nur zwei Tabellen in der Datenbank, und sie sehen wie folgt aus:
Hinweis: Es sind keine Fremd in der Datenbank angegebenen Schlüssel überhaupt - ich bin nur die Durchsetzung der Beziehung in der Modell (Ich kann die Datenbank nicht ändern).
Sie haben jeweils eine Reihe von Daten, die in ihnen, die wie folgt aussieht:
Ich führte die folgende Abfrage die Join funktionieren würde, um sicherzustellen,
Jetzt Ich habe die folgenden Einheiten:
public class Two
{
public long TwoId { get; set; }
public string OneId { get; set; }
public virtual One One { get; set; }
}
public class One
{
public string OneId { get; set; }
public DateTime DeliveryDate { get; set; }
public virtual ICollection<Two> Twos { get; private set; }
public void AddTwo(Two two)
{
if (two == null)
throw new ArgumentNullException("two");
if (Twos == null)
Twos = new List<Two>();
if (!Twos.Contains(two))
Twos.Add(two);
two.One = this;
}
}
Und dies ist der Kontext:
public class TestContext : DbContext
{
public TestContext(string conectionString)
: base(conectionString)
{
Configuration.LazyLoadingEnabled = true;
Ones = Set<One>();
Twos = Set<Two>();
}
public DbSet<One> Ones { get; private set; }
public DbSet<Two> Twos { get; private set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var one = modelBuilder.Entity<One>();
one.ToTable("One");
one.HasKey(d => d.OneId);
var two = modelBuilder.Entity<Two>();
two.ToTable("Two");
two.HasKey(d => new
{
d.OneId,
d.TwoId
});
two.Property(p => p.TwoId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
two.HasRequired(t => t.One)
.WithMany(o => o.Twos)
.HasForeignKey(o => o.OneId);
base.OnModelCreating(modelBuilder);
}
}
Als ich dieses Stück Code ausführen ich Why is this printed?
gedruckt auf meine Konsole bekommen - was ich erwarte nicht, wie Sie, dass die Navigationseigenschaft sehen können, sollte in (I gefüllt werden auch enthalten explizit):
using (var ctx = new TestContext(@"......"))
{
const string oneId = "111348718";
var one = ctx.Ones.Single(o => o.OneId.Equals(oneId));
if (one != null)
{
var sdi = ctx
.Twos
.Include(s => s.One)
.Single(s => s.OneId.Equals(oneId));
if (sdi.One == null)
{
Console.WriteLine("Why is this printed?");
}
else
{
Console.WriteLine("This is what I expect");
}
}
}
Nun dies die wirklich ungerade Bit: Wenn ich einfach die DeliveryDate
Eigenschaft aus der One
Klasse kommentieren sie es funktioniert gut (ich This is what I expect
gedruckt t o die Konsole).
Was ist hier falsch und wie kann ich es lösen?
HINWEIS: Wenn ich an der DeliveryDate
Eigenschaft auf den one
Variable sehe es auf den erwarteten Wert richtig eingestellt wurde, so das Datum in der Datenbank und Entity Framework in Ordnung sein muss, ist durchaus in der Lage, es zu verwirklichen.
Weitere Informationen: Die Tatsache, dass es sich um ein Datum spielt keine Rolle - wenn es, sagen wir ein nvarchar es immer noch nicht - jede einfache Eigenschaft scheint die ganze Sache verursacht umfallen - auf das fühlt sich an wie ein Bug Ich ...