【发布时间】:2023-03-09 07:57:01
【问题描述】:
在我的控制器操作中,我正在尝试将新图像添加到数据库中。图片需要关联设备,设备关联用户。
所以我有我的实体类:
public class Image
{
public int Id { get; set; }
public string Url { get; set; }
[Required]
public virtual Device { get; set; }
}
public class Device
{
public int Id { get; set; }
public string Name { get; set; }
[Required]
public virtual User { get; set; }
}
public class User
{
public int Id { get; set; }
public string Login{ get; set; }
public virtual ICollection<Device> Devices { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
public virtual string Email{ get; set; }
}
现在当我尝试像这样添加新图像时:
var image = new Image();
image.Device = Db.DbSet<Device>().Find(1);
Db.DbSet<Image>().Add(image);
Db.DbSet<Image>().SaveChanges();
问题是,当我使用这个Find 来加载现有设备(用户和所有属性设置正确)时,我没有在设备中获得正确填充的用户属性。就像延迟加载不起作用。有一个 User 对象的实例,但它的 id 设置为 0,并且所有其他字段都设置为其默认值。
我将所有导航属性设置为虚拟,延迟加载在我的其他实体上也可以正常工作,因此它绝对没有关闭或其他什么。
有趣的是,当我在添加图像之前更改我的代码并进行如下比较时,它会加载用户并正常工作:
if (AuthenticationHelper.CurrentUser != image.Device.User)
return null;
就像它在这一刻设法加载用户一样。如果我们将这个比较顺序更改为关注image.Device.User != AuthenticationHelper.CurrentUser,它将不再起作用。
有什么想法吗?
【问题讨论】:
-
您的
Device类是否具有实例化User属性的默认构造函数?如果是,请尝试在没有实例化的情况下它是否可以正常工作。 -
@Slauma - 事实证明你是对的!请添加答案,以便我接受。
标签: c# asp.net-mvc entity-framework entity-framework-5 lazy-loading