有問題/答案與我即將提出的問題類似,但是沒有一個人有完整的答案。 (很抱歉,如果我錯過了什麼,而搜索)實體框架多對多映射表和重複。 Code First
DB結構:
public class ApplciationDbContext : DbContext()
{
public DbSet<Photo> Photos { get; set; }
public DbSet<Tag> Tags { get; set; }
public DbSet<Tag_Photo_XREF> TagPhoto_XREF { get; set; }
}
public abstract class BaseEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
}
public class Tag : BaseEntity
{
public Tag()
{
Photos = new HashSet<Tag_Photo_XREF>();
}
public string TagText { get; set; }
public virtual ICollection<Tag_Photo_XREF> Photos { get; set; }
}
public class Tag_Photo_XREF : BaseEntity
{
public Guid TagId { get; set; }
public Guid PhotoId { get; set; }
public int Score { get; set; }
public virtual Tag Tag { get; set; }
public virtual Photo Photo { get; set; }
}
public class Photo : BaseEntity
{
public Photo()
{
Tags = new HashSet<Tag_Photo_XREF>();
GeneratedTags = new HashSet<GeneratedTag_Photo_XREF>();
}
public virtual ICollection<Tag_Photo_XREF> Tags { get; set; }
}
}
我看到這一切是如何掛在一起,但我的問題是: 1)如何防止標籤重複插入主。 2)如何在第一個地方插入?我該怎麼辦:
Photo p = new Photo();
Tag_Photo_XREF tagPhotoXref1 = new Tag_Photo_XREF();
tagPhotoXref1.Tag = new Tag() { TagText = "...1" };
Tag_Photo_XREF tagPhotoXref2 = new Tag_Photo_XREF();
tagPhotoXref2.Tag = new Tag() { TagText = "...2" };
Tag_Photo_XREF tagPhotoXref3 = new Tag_Photo_XREF();
tagPhotoXref3.Tag = new Tag() { TagText = "...3" };
p.Tags.Add(tagPhotoXref1);
p.Tags.Add(tagPhotoXref2);
p.Tags.Add(tagPhotoXref3);
dbContext.Photos.Add(p);
dbContext.SaveChanges();
或類似的東西:
Photo p = new Photo();
Tag_Photo_XREF tagPhotoXref1 = new Tag_Photo_XREF();
tagPhotoXref1.Tag = new Tag() { TagText = "...1" };
tagPhotoXref1.Photo = p;
Tag_Photo_XREF tagPhotoXref2 = new Tag_Photo_XREF();
tagPhotoXref2.Tag = new Tag() { TagText = "...2" };
tagPhotoXref1.Photo = p;
Tag_Photo_XREF tagPhotoXref3 = new Tag_Photo_XREF();
tagPhotoXref3.Tag = new Tag() { TagText = "...3" };
tagPhotoXref1.Photo = p;
dbContext.TagPhoto_XREF.Add(tagPhotoXref1);
dbContext.TagPhoto_XREF.Add(tagPhotoXref2);
dbContext.TagPhoto_XREF.Add(tagPhotoXref3);
dbContext.Photos.Add(p);
dbContext.SaveChanges();
兩種方式都顯得很凌亂和過於複雜。如果我不需要鏈接表上的Score屬性,這將會非常不同。
關於這一點的另一個問題是,如果我必須從如何可以防止相同的標記作爲嵌入不同的用戶我ApplicationDbContext多個連接(文字必須是唯一的)
也許我錯過了點方式複雜化。
感謝
史蒂夫
這個示例是嗎?在'Photo'實體中,您有'GeneratedTags = new HashSet();'但我看不到'GeneratedTags'屬性。 –
Leron
@Leron是的,我複製這個並刪除了很多其他的屬性..ignore在ctor它只是無關。 –