我试图通过在sqlite数据库中编写一个简单的主 - 详细信息关系来了解EF7。保存工作正常,阅读但令我头疼:
以下是我的实体:
public class Message
{
public int MessageId { get; set; }
public string Name { get; set; }
public List<MessagePart> MessageParts { get; set; }
}
public class MessagePart
{
public int MessagePartId { get; set; }
public string Text { get; set; }
public int MessageId { get; set; }
public Message Message { get; set; }
}
createMessage()完成它应该做的事情:
static void createMessages()
{
using (var db = new TestContext())
{
var m1 = new Message
{
Name = "train_arrives_in_x_minutes",
MessageParts = new List<MessagePart>()
{
new MessagePart {
Text = "Train arrives in 5 minutes"
},
new MessagePart {
Text = "Zug faehrt in 5 Minuten ein",
}
}
};
var m2 = new Message
{
Name = "train_out_of_service",
MessageParts = new List<MessagePart>()
{
new MessagePart {
Text = "train is out of service"
},
new MessagePart {
Text = "Kein Service auf dieser Strecke",
}
}
};
db.Messages.Add(m1);
db.Messages.Add(m2);
var count = db.SaveChanges();
Console.WriteLine("{0} records saved to database", count);
}
}
从现有数据库读取精确读取主记录,但详细记录集指针保持为空。
static void readMessages()
{
using (var db = new TestContext())
{
foreach (Message m in db.Messages)
{
Console.WriteLine(m.Name);
// exception here: m.MessageParts is always null
foreach(MessagePart mp in m.MessageParts)
{
Console.WriteLine("mp.Text={0}", mp.Text);
}
}
}
}
我有什么办法可以强制加载这些消息部分吗?我之前曾与其他(Python)ORM合作过,之前从未遇到过这个问题。这是Lazy Loading的问题吗?我尝试使用LINQ语句获取这些子记录,这也没有帮助。但是数据库中的一切看起来都不错。
答案 0 :(得分:2)
如果要启用LazyLoading,则需要启用 LazyLoading (默认情况下应启用)并使您的属性虚拟:
(['IbCommisions.ib_id' => $this->userid OR 'Users.country_id' => $this->request->data['country']])
你的模特看起来像:
public TestContext()
: base(Name = "ConntextionName")
{
this.Configuration.ProxyCreationEnabled = true;
this.Configuration.LazyLoadingEnabled = true;
}
如果您不想使用LazyLoading,可以使用预先加载来加载相关实体:
public class Message
{
public int MessageId { get; set; }
public string Name { get; set; }
public virtual ICollection<MessagePart> MessageParts { get; set; }
}
public class MessagePart
{
public int MessagePartId { get; set; }
public string Text { get; set; }
public int MessageId { get; set; }
public virtual Message Message { get; set; }
}
有关详细信息,请查看this site。