У меня есть другой обходной путь для этого. Поскольку в некоторых случаях Image (класс для свойства Logo) не может быть null
, а в некоторых это может быть, я решил добавить некоторое наследование к моей модели Image. Вот что я сделал:
public class OptionalImage
{
public long? ImageId
{
get;
set;
}
[DisplayName("Obraz")]
[StringLength(200, ErrorMessage = "Url jest za długi")]
[RegularExpression(@".*\.(jpg|gif|png|jpeg|tif|tiff|JPG|GIF|PNG|JPEG|TIF|TIFF)$", ErrorMessage = "Rozszerzenie pliku jest nieprawidłowe. Dopuszczone to: .jpg, .gif, .png, .jpeg, .tif, .tiff")]
public string Url
{
get;
set;
}
[StringLength(200, ErrorMessage = "Tekst alternatywny jest za długi")]
[DisplayName("Tekst alternatywny")]
public string Alt
{
get;
set;
}
}
public class Image : OptionalImage
{
public new long ImageId
{
get;
set;
}
}
Тогда мой репозиторий возвращает обнуляемый идентификатор только для объектов, которые имеют отношение 0..1 к Image-like Brand. Но Продукт, имеющий обязательное свойство DefaultImage, будет использовать Image без идентифицируемого идентификатора, который соответствует базе данных и дизайну бизнес-логики.
Метод GetAll
в хранилище теперь выглядит следующим образом (спасибо @omoto за подсказку):
public IQueryable<Model.Products.Brand> GetAll()
{
IQueryable<Model.Products.Brand> brands = from b in EntitiesCtx.Brands
let logo = EntitiesCtx.Images.FirstOrDefault(c => c.ImageId == b.Logo.ImageId)
select new Model.Products.Brand()
{
BrandId = b.BrandId,
Name = b.Name,
Description = b.Description,
IsActive = b.IsActive,
Logo = new Model.Cms.OptionalImage()
{
ImageId = logo.ImageId,
Alt = logo.Alt,
Url = logo.Url
}
};
return brands;
}
Для продуктов вместо new Model.Cms.OptionalImage()
я буду использовать new Model.Cms.Image()
, и поскольку значение ImageId
базы данных, поданной в этом случае, не может быть нулевым, оно будет работать нормально, и все будет естественно в контроллерах и представлениях.
Я думаю, что этот вид обходного пути очень хорошо отвечает моим потребностям. Тем не менее, если у кого-то есть лучшее решение, не стесняйтесь отвечать.