[英]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,因為它們只有在保存后才可用。 這樣一來,就必須具有Tag
和Image
的導航屬性。
調用SaveChanges
,圖像將保存到數據庫,並獲取其數據庫生成的ID。 保存每個標簽時也會發生同樣的情況。 並且,當保存每個ImageTagId
,由於它與已經具有id的標簽和圖像相關,因此EF復制這些ID,然后將“ fixed-up”對象保存到DB。 在MSDN上閱讀此文章: 關系和導航屬性 ,特別注意同步FK和導航屬性之間的更改部分。
EF中的多對多關系
如果要在EF上定義純多對多關系,則需要僅具有
在您的特定情況下,您應該有一個表,該表僅具有一個ID(從FK到圖像),另一個ID(從FK到Tag)以及由兩個FK組成的主鍵。
當您使用EF多對多關系時,聯結表在模型中不會顯示為完整。 相反,您只有從每一側到另一側的集合的導航屬性。 在您的特定方面,您會在Tag上有一個Images集合,在Image上有一個Tags集合。
如果您像這樣實現了很多,則聯結表條目將由EF自動管理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.