Używam Entity Framework 4.3.1 przy użyciu podejścia DbContext POCO przeciwko bazie danych SQL Server 2012.Dlaczego datetime uniemożliwi załadowanie właściwości nawigacji?
Mam tylko dwie tabele w bazie danych i wyglądają tak:
UWAGA: Brak kluczy obcych określone w bazie danych w ogóle - mam egzekwowania tylko relacje w model (nie mogę zmienić bazy danych).
każdy z nich ma jeden wiersz danych w nich, który wygląda tak:
Wykonałem następujące zapytanie do zapewnienia przyłączenia będzie działać:
teraz Mam następujące podmioty:
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;
}
}
I to jest kontekst:
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);
}
}
Gdy ten kawałek kodu otrzymuję Why is this printed?
drukowane na konsolę - co nie spodziewam jak widać, że właściwość nawigacji powinny być wypełnione (I nawet jawnie włączyła ją):
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");
}
}
}
teraz to jest naprawdę dziwne nieco: Gdybym po prostu skomentuj właściwość DeliveryDate
z klasy One
działa dobrze (mam This is what I expect
nadrukiem T o konsola).
Co jest nie tak i jak mogę to rozwiązać?
UWAGA: Jeśli spojrzeć na nieruchomości DeliveryDate
na one
zmiennej został prawidłowo ustawiony do wartości oczekiwanej więc data musi być OK w bazie danych i ramy podmiot jest w stanie doskonale ją urzeczywistnić.
Więcej informacji: Fakt, że jest to data nie ma znaczenia - jeśli jest, powiedzmy nvarchar nadal się nie powiedzie - wydaje dowolny prosty właściwość powoduje, że całość przewrócenie - to czuje się jak robaka do ja ...