public static BitmapImageExpressionResult DeviceModelImage(DeviceModel DeviceModel) { if (DeviceModel == null) throw new ArgumentNullException("DeviceModel"); using (Stream deviceModelImage = DeviceModel.Image()) { if (deviceModelImage == null) return null; else return ImageFromStream(deviceModelImage); } }
public static Tuple<DeviceModel, bool> GetOrCreateDeviceModel(this DbSet<DeviceModel> DeviceModelsSet, string Manufacturer, string Model, string ModelType) { if (string.IsNullOrWhiteSpace(Manufacturer)) Manufacturer = "Unknown"; else Manufacturer = Manufacturer.Trim(); if (string.IsNullOrWhiteSpace(Model)) Model = "Unknown"; else Model = Model.Trim(); if (string.IsNullOrWhiteSpace(ModelType)) ModelType = null; else ModelType = ModelType.Trim(); // Already Exists? var deviceModel = DeviceModelsSet.FirstOrDefault(dm => dm.Manufacturer == Manufacturer && dm.Model == Model); if (deviceModel == null) { // Ensure only one thread/request at a time lock (_CreateDeviceModelLock) { // Check again now that lock is enforced deviceModel = DeviceModelsSet.FirstOrDefault(dm => dm.Manufacturer == Manufacturer && dm.Model == Model); if (deviceModel == null) { // Create the Device Model in a different DataContext so we don't have to commit unrelated changes using (DiscoDataContext database = new DiscoDataContext()) { var description = $"{Manufacturer} {Model}"; if (Model.Equals("Unknown", StringComparison.OrdinalIgnoreCase)) { description = $"Unknown {Manufacturer} Model"; } var addDeviceModel = new DeviceModel { Manufacturer = Manufacturer, Model = Model, ModelType = ModelType, Description = description }; database.DeviceModels.Add(addDeviceModel); database.SaveChanges(); } // Obtain the Device Model with the in-scope DataContext // - Overhead acknowledged, but reasonable given the infrequency of occurrence deviceModel = DeviceModelsSet.FirstOrDefault(dm => dm.Manufacturer == Manufacturer && dm.Model == Model); return new Tuple<DeviceModel, bool>(deviceModel, true); } } } else { if (deviceModel.ModelType != ModelType) deviceModel.ModelType = ModelType; } return new Tuple<DeviceModel, bool>(deviceModel, false); }