2013-09-27 77 views
0

是否可以將相同的實體添加到兩個不同的實體而不重複子實體?奇怪的問題,我知道,但這裏是我想要的僞代碼做...如何使用linq-to-sql或實體框架將實體添加到兩個不同的父實體?

Transaction tran = new Transaction() 

Task task = new Task(); 
task.Name = "My Task"; 

User user = new User(); 
user.Name = "John Smith"; 
user.Tasks.Add(task); 

Document doc = new Document(); 
doc.Path = @"c:\temp\MyDoc.pdf"; 
doc.Tasks.Add(task); 

tran.Users.Add(user); 
tran.Documents.Add(doc); 

tran.Create(); 

我希望開發商能夠只是相同的任務對象同時添加到收藏User.Tasks和Document.Tasks集合,因此當我在Create()方法中插入數據庫時​​,它知道該任務通過UserID和DocumentID與用戶和文檔相關。

任務表必須和每個ID:

任務表

ID   int 
UserID  int 
DocumentID int 
etc... 

回答

1

一個相當簡單的模型,這樣做:

public class Task 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public Document Document { get; set; } 
    public User User { get; set; } 
} 

public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public ICollection<Task> Tasks { get; set; } 
} 

public class Document 
{ 
    public int ID { get; set; } 
    public string Path { get; set; } 
    public ICollection<Task> Tasks { get; set; } 
} 

默認情況下,EF會說出外鍵列Document_IDUser_ID(帶下劃線)。如果你不希望你可以告訴EF應該使用其他列名稱,例如像這樣(在DbContext中):

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Document>() 
       .HasMany(t => t.Tasks) 
       .WithOptional(t => t.Document) 
       .Map(m => m.MapKey("DocumentID")); 
} 
+0

完美!謝謝!! – RichC

+0

如果我先做數據庫,並且將關係映射到正確的ID,我是否仍需要OnModelCreating方法? – RichC

+1

@RichC編號edmx包含模型。你不應該重寫'OnModelCreating'。默認情況下,在數據庫中 - 此覆蓋包含'throw new UnintentionalCodeFirstException();'。 –