簡體   English   中英

如何在EF中保存關系條目

[英]How to save relational entries in EF

我的數據庫中有3個表。

1個稱為圖像,1個稱為標簽,最后一個表稱為ImageTagIds

我的圖像表具有ID和路徑

我的標簽有ID和詞組

我的ImageTagIds具有ID,ImageId和TagId

我希望這些名稱有助於自我解釋,但是Image表和ImageTagIds之間存在一對多的關系,其中Image.ID連接到ImageTagIds.ImageId

Tag表和ImageTagIds之間存在一對一的關系,其中Tag.Id連接在ImageTagIds.Id上

我在SSMS中添加了一個數據庫圖,並創建了所有鍵和關系。

在VS 2012中,我創建了一個新的EF(.edmx)文件,並添加了表。 VS用巫術做一些事情,現在我可以將桌子當作對象了。 這很好用,我可以毫無例外地查詢和保存。

我遇到的問題是建立關系。

這就是我走了多遠

    private Dal.MyEntities _dc = new MyEntities();

    public void Save(string filePath, IList<string> tags)
    {
        FileInfo fi = new FileInfo(filePath);

        this._dc.Images.Add(new Image()
        {
            Path = fi.DirectoryName
        });

        foreach (var tag in tags)
        {
            this._dc.Tags.Add(new Tag()
            {
                Phrase = tag
            });
        }

        _dc.SaveChanges();
    }

上面的內容保存到Tags表和Image表中,但是ImageTagIds表保持為空。 我明白為什么,我從不嘗試寫信,但這就是我迷路的地方。 我不知道可以向ImageTagsId表寫入/編碼什么。

更多的研究使我進入了http://www.entityframeworktutorial.net/entity-relationships.aspx ,這(我認為)EF應該知道這些關系在哪里。 即使這樣做,我也不知道可以保存什么/如何保存,因為當我向數據庫中添加新條目時我不知道ID是什么。

您正在添加標簽,並且正在添加圖像,但沒有在圖像中添加標簽。

嘗試以下

_dc.Images.FirstOrDefault()。Tags.Add(new Tag(){短語=“某物”});

從實體的角度來看,這將為特定圖像添加標簽。 從db表的角度來看,它將標記添加到Tags表和ImageTagIds表中。

編輯 :如果您沒有Tags屬性,則應首先確保正確建立數據庫關系。 如果不是這種情況,您可以嘗試

TagsImagesIds tagImageRelation = new TagsImagesIds();
tagImageRelation.ImageId = image.Id;
tagImage.Relation.TagId = tag.Id;
_dc.TagsImagesIds.Add(tagImageRelation);

通常,缺少圖像中的Tags屬性的原因是,表中除了TagId和ImageId之外還有更多列,因此EF創建了3個類來表示表,而不是2。

這是一個多對多關系,是通過具有附加屬性的聯結表實現的(並且鍵的定義與EF對多對多關系的期望不匹配)。 在這種情況下,EF將聯結表視為其他任何實體,因此您必須自己創建條目並將其保存到該表中。 請參閱底部有關多對五關系的注釋

ImagetTagId是您的ImagetTagId具有以下內容:

  • 關系, Image的導航屬性
  • 關系和Tag導航屬性

並且ID是數據庫生成的(身份),則只需創建所有必要的ImageTagId對象並設置導航屬性。 當您調用SaveChanges ,DbContext將進行關系ImageTagId ,在ImageTagId對象中設置正確的ID並將其保存到數據庫。

應該是這樣的:

    Image img = new Image()
    {
        Path = fi.DirectoryName
    };
    this._dc.Images.Add(img);

    foreach (var tag in tags)
    {
        Tag tag = new Tag()
        {
            Phrase = tag
        };
        this._dc.Tags.Add();
        ImageTagId = new ImageTagId { Image = image, Tag = tag };
        this._dc.ImageTagIds.Add(ImageTagId);
    }

顯然,您無法做的是在ImageTagId設置他ID,因為它們只有在保存后才可用。 這樣一來,就必須具有TagImage的導航屬性。

調用SaveChanges ,圖像將保存到數據庫,並獲取其數據庫生成的ID。 保存每個標簽時也會發生同樣的情況。 並且,當保存每個ImageTagId ,由於它與已經具有id的標簽和圖像相關,因此EF復制這些ID,然后將“ fixed-up”對象保存到DB。 在MSDN上閱讀此文章: 關系和導航屬性 ,特別注意同步FK和導航屬性之間的更改部分。

EF中的多對多關系

如果要在EF上定義純多對多關系,則需要僅具有

  • 一個FK到多對多邊之一
  • 另一邊的FK
  • 由兩個FK組成的PK

在您的特定情況下,您應該有一個表,該表僅具有一個ID(從FK到圖像),另一個ID(從FK到Tag)以及由兩個FK組成的主鍵。

當您使用EF多對多關系時,聯結表在模型中不會顯示為完整。 相反,您只有從每一側到另一側的集合的導航屬性。 在您的特定方面,您會在Tag上有一個Images集合,在Image上有一個Tags集合。

如果您像這樣實現了很多,則聯結表條目將由EF自動管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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