我们刚刚更新到EF6,与上一个版本相比,我们遇到了一个奇怪的行为问题。
如果属性是可空的,则用于为Include语句生成左联接。但是,这个版本似乎也考虑到了所需的属性。
例如,我有以下课程:
public class Client
{
[DisplayName("Industry Code")]
[Required]
public int? IndustryId { get; set; }
[ForeignKey("IndustryId")]
public Industry IndustryEntity { get; set; }
}当我们这样做
return db.Clients
.Include(o => o.CountryISOEntity)
....
.Include(o => o.IndustryEntity)
.Single(o => o.Id == clientId);上一个版本生成左外部联接,但新版本生成内部连接。
如果我移除所需的属性,它就会生成左联接。但是在我的例子中,它不是一个选项,因为我们使用这个属性向用户显示错误,但是用户可以选择保存不完整的实体,然后返回到它。当用户返回时,会得到记录不存在的错误,因为include生成内部联接。
新EF6中是否存在禁用此行为(忽略属性)并根据可空信息生成sql查询的设置?或者我可以在包含中强制左加入吗?还是我们回滚到以前的EF版本的唯一选择?
PS:我们正在使用.Net 4.0
谢谢
发布于 2013-10-31 16:22:17
我假设您希望在MVC中使用Required属性进行表单验证,而不是告诉Entity该属性是必需的。这就是您需要视图模型的原因,因此您可以将视图的验证逻辑与实体框架验证逻辑分离开来。
视图模型表示视图,并包含呈现视图所需的所有数据。域模型(实体)表示数据库中的一个(或多个)表。视图模型不一定包含与域模型相同的属性。在我个人的经验中,它们通常是不同领域模型的组合。
如果为Client创建视图模型,则可以从EF中删除验证属性。
视图模型如下所示:
public class ClientModel
{
[DisplayName("Industry Code")]
[Required]
public int IndustryId { get; set; }
// Other properties..
}那么你的POCO看起来就像这样:
public class Client
{
public int? IndustryId { get; set; }
[ForeignKey("IndustryId")]
public Industry IndustryEntity { get; set; }
}https://stackoverflow.com/questions/19711079
复制相似问题