[英]Easier way of avoiding duplicates in entity framework
任何人都可以提供一種更簡單,更自動的方式來執行此操作嗎?
我為FilterComboTemplate模型具有以下保存方法。 Webapi已將數據從json轉換為ac#模型實體。
因此,我不必在DeviceProperty表中創建重復的條目,而必須依次遍歷每個過濾器並從上下文中檢索分配的DeviceFilterProperty,並覆蓋過濾器中的對象。 請參見下面的代碼。
我已經擁有了所有對象ID(如果它們已經存在),因此似乎應該自動處理它,但這也許只是一廂情願。
public void Save(FilterComboTemplate comboTemplate)
{
// Set the Device Properties so we don't create dupes
foreach (var filter in comboTemplate.Filters)
{
filter.DeviceProperty = context.DeviceFilterProperties.Find(filter.DeviceFilterProperty.DeviceFilterPropertyId);
}
context.FilterComboTemplates.Add(comboTemplate);
context.SaveChanges();
}
從這里開始,我將必須檢查是否也存在任何過濾器,然后手動更新它們(如果它們與數據庫中的過濾器不同),以免在編輯FilterComboTemplate之后不創建全新的集合。
我發現自己在寫很多這類代碼。 我已經包含下面的其他模型類的一些背景。
public class FilterComboTemplate
{
public FilterComboTemplate()
{
Filters = new Collection<Filter>();
}
[Key]
public int FilterComboTemplateId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public ICollection<Filter> Filters { get; set; }
}
public class Filter
{
[Key]
public int FilterId { get; set; }
[Required]
public DeviceFilterProperty DeviceFilterProperty { get; set; }
[Required]
public bool Exclude { get; set; }
[Required]
public string Data1 { get; set; }
}
public class DeviceFilterProperty
{
[Key]
public int DeviceFilterPropertyId { get; set; }
[Required]
public string Name { get; set; }
}
從請求綁定之后,似乎對參數進行了一些常規操作。
您可以考慮編寫自定義參數綁定以重用代碼。 HongMei的博客是一個很好的起點: http : //blogs.msdn.com/b/hongmeig1/archive/2012/09/28/how-to-customize-parameter-binding.aspx
您可以使用方案2中的代碼來獲取格式化程序綁定,以從主體反序列化模型,然后執行所需的操作。
請參閱博客中的最后一步,以指定要自定義的參數類型。
從關於SO的一些 類似 問題來看,EF似乎並不會自動執行某些操作...
它可能不會大量削減代碼,但是您可以執行以下操作,在DbContext(或您的特定dataContext)上使用擴展方法:
public static bool Exists<TEntity>(this MyDataContext context, int id)
{
// your code here, something similar to
return context.Set<TEntity>().Any(x => x.Id == id);
// or with reflection:
return context.Set<TEntity>().Any(x => {
var props = typeof(TEntity).GetProperties();
var myProp = props.First(y => y.GetCustomAttributes(typeof(Key), true).length > 0)
var objectId = myProp.GetValue(x)
return objectId == id;
});
}
這將檢查DbContext中是否存在具有該鍵的對象。 自然地,可以創建類似的方法來實際返回該實體。
代碼中有兩個“返回”,只需使用您喜歡的一個即可。 前者將迫使您讓所有實體都從具有Id屬性的“實體”對象繼承(這不一定是一件壞事,但是我可以看到這很痛苦……您還需要強制執行TEntity參數: where TEntity : Entity
或類似名稱)。 用一點點的“反射”解決方案,首先性能可能是個問題,其次我現在沒有VS運行,所以我什至不知道它是否可以編譯,更不用說工作了!
讓我知道是否可行:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.