【发布时间】:2012-08-02 11:40:43
【问题描述】:
我正在使用实体框架 4.3.1,使用 DbContext POCO 方法针对 SQL Server 2012 数据库。
我在数据库中只有两个表,它们看起来像这样:
注意:数据库中根本没有指定外键 - 我只是在模型中强制执行关系(我无法更改数据库)。
它们每个都有一行数据,如下所示:
我执行了以下查询以确保连接可以正常工作:
现在,我有以下实体:
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;
}
}
这是上下文:
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);
}
}
当我运行这段代码时,Why is this printed? 打印到我的控制台 - 我不希望你可以看到应该填写导航属性(我什至明确包含它):
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");
}
}
}
现在,这是非常奇怪的一点:如果我只是从 One 类中注释掉 DeliveryDate 属性,它就可以正常工作(我将 This is what I expect 打印到控制台)。
这里出了什么问题,我该如何解决?
注意:如果我查看 one 变量上的 DeliveryDate 属性,它已正确设置为预期值,因此数据库中的日期必须是正确的,并且实体框架完全能够实现它.
更多信息:它是一个日期这一事实并不重要 - 如果是,说一个 nvarchar 它仍然失败 - 似乎任何简单的属性都会导致整个事情崩溃 - 这感觉就像对我来说是一个错误......
【问题讨论】:
标签: c# ef-code-first sql-server-2012 navigation-properties entity-framework-4.3.1