2013-12-08 91 views
0

假設我有兩個實體。文章和類別。以下示例: -Linq To Entities插入多對多但唯一的值

public class Article 
{ 
    public int Id { get; set; } 
    public DateTime DatePublished { get; set; } 
    public DateTime? DateEdited { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public List<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Article> Articles { get; set; } 
} 

兩者之間存在多對多關係,因此ArticleCategory連接表也起作用。如果我再創建一個新的文章對象,說: -

var article1 = new Article{Content = "Article 1", Categories = new List<Categories>{new Category{Name = "Random Category"}} 

,然後我這個保存到數據庫,然後我創建完全相同的「Random類」,同一類別名稱的另一篇文章的對象,那麼我的分類表包含'Random Category'的兩個條目,當我只想要存儲唯一的類別名稱值時。所以我的問題是,使用LINQ to Entities,我將如何着手實現這一點,特別是要牢記最佳實踐。我假設我會使用Any運算符與類別表進行比較,但是如果找到匹配項,那麼如何在聯結表中正確鏈接名稱以引用現有名稱。我一直在谷歌搜索,但很難找到任何有價值的話題。我有自己的想法如何處理這個問題,但重要的是我可以將絨毛剪掉並直接接觸到底,這樣我就可以確保我第一次做對了。先謝謝你。

+0

嘗試一下。目前正在擺弄獲取System.Data.SqlServerCe.SqlCeException:無法插入外鍵值,因爲相應的主鍵值不存在。 [外鍵約束名稱= FK_ArticleCategory_Categories_Category_Id] –

+0

@Gert Arnold。要按照可能的重複答案中詳細說明的方法使用attach方法,我需要提供類別主鍵或者出現上述錯誤。但是,傳入類別數據僅包含類別名稱,因此在這種情況下,附加方法將不起作用。 –

回答

0

做到這一點的一種方法是創建一個存儲過程,它接受所有參數並在SQL端按名稱查找類別。我假定你不想這樣做。

我知道使用EF做這件事的唯一方法是獲取Category實體的實例並手動分配它。這將需要兩個查詢,一個用於獲取實體,另一個用於插入您的新實體。

var category = db.Categories.FirstOrDefault(c => c.Name == categoryName) 
       ?? new Category { Name = categoryName }; 
var article = new Article 
       { 
       Content = content, 
       Categories = { category } 
       };