簡體   English   中英

避免實體框架中重復項的更簡單方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM