2012-05-04 86 views
0

這是我的模型多對多插入代碼實體框架第一

public class Post 
    { 
    public long PostID { get; set; } 

    [Required] 
    [MaxLength(255)] 
    public string Title { get; set; }  
    }  

    public class Tag 
    {  
    public long TagID { get; set; } 
    [Required] 
    [Display(Name = "Tag Name")] 
    [MaxLength(30)] 
    public string TagName { get; set; } 
    public bool IsActive { get; set; } 
    } 

    public class TagPost 
    {  
    public long TagPostID { get; set; }  
    public long PostID { get; set; }  
    public long TagID { get; set; } 

    [ForeignKey("PostID")] 
    public virtual Post Posts { get; set; } 
    [ForeignKey("TagID")] 
    public virtual Tag Tags { get; set; } 
    } 

1)這是正確的許多人在EF 4.1很多配置不提ModelBinder的許多許多。

2)如果我已經使用dataannotation完成了多對多的配置,爲什麼數據沒有插入到tagpost中。

public void InsertPostQuestion(Post post,List<string> tags) 
    { 

     context.Posts.Add(post); 
     foreach (string tag in tags) 
     { 
      Tag tagr = new Tag(); 
      tagr.TagName = tag; 
      tagr.IsActive = true; 
      context.Tags.Add(tagr); 

     }   
     context.SaveChanges(); 

    } 

3)我必須定義modelbinder有多次插入或刪除或更新?

modelBuilder.Entity<Post>(). 
     HasMany(c => c.Tags). 
     WithMany(p => p.Posts). 
     Map(
     m => 
     { 
      m.MapLeftKey("PostID"); 
      m.MapRightKey("TagID"); 
      m.ToTable("TagPost"); 
     }); 

回答

2

改變你的模型如下:

public class Post 
{ 
public long PostID { get; set; } 

[Required] 
[MaxLength(255)] 
public string Title { get; set; } 

public bool IsActive { get; set; } 

public virtual List<Tag> Tags { get; set; } 
} 

public class Tag 
{  
public long TagID { get; set; } 
[Required] 
[Display(Name = "Tag Name")] 
[MaxLength(30)] 
public string TagName { get; set; } 
public bool IsActive { get; set; } 

public virtual List<Post> Posts { get; set; } 
} 

,然後保存,像這樣:

public void InsertPostQuestion(Post post,List<string> tags) 
{ 
    context.Posts.Add(post); 
    foreach (string tag in tags) 
    { 
     // TODO: If tag has a unique index on TagName, see if it exists first 
     Tag tagr = new Tag(); 
     tagr.TagName = tag; 
     tagr.IsActive = true; 
     context.Tags.Add(tagr); 
     post.Tags.Add(tagr); 
    }   
    context.SaveChanges(); 
} 

EF將在數據庫中創建中間表,並很好地自動填充它。

+0

然後,您需要創建第三個模型定義,並在foreach中實例化第三個類。在你的例子中,有一個[Key] TagPostId,但它對應用程序沒有任何價值,所以這不算數。 – robrich

+0

你的意思是我必須做一個手動輸入tagpost,如果我正在創建第三個模型? – maztt

+0

是的,如果你需要額外的屬性,你需要構造和處理這個第三個模型。如果它只是兩個模型之間的多對多鏈接,您可以在每個模型中只有一個List ,而EF會自動創建內部表格。 – robrich

相關問題