2

我們有2個表:EF庫模式多對多插入

表管理局:

public class Authority 
{ 
    public int ID {get;set;} 
    public string Name{get;set;} 
     ... 
} 

表代理

public class Agent 
{ 
    public int ID{get;set;} 
    public int FirstName{get;set;} 
} 

而且我們有許多一對多它們之間的關係兩張表:

public class AuthorityConfiguration : EntityTypeConfiguration<Authority> 
{ 
    public AuthorityConfiguration() 
     : base() 
    { 
     HasKey(p => p.ID); 

     HasMany(p => p.Agents).WithMany(a => a.Authorities).Map(mc => 
      { 
       mc.MapLeftKey("AuthorityID"); 
       mc.MapRightKey("AgentID"); 
       mc.ToTable("AuthorityAgent"); 
      }); 


     ToTable("Authority"); 

    } 
} 

一切工作正常。 但現在我有一個頁面來創建表之間的關聯,我需要使用存儲庫模式插入我的表「authorityAgent」關係。

問題1:如果我的DAO正在接收授權,如何獲得代理?

AuthorityDAO.cs

public static void InsertAgent(int authorityID, int agentID) 
    { 
     var dao = new ConcreteDAO<Authority>(); 

     Authority authority = dao.Single(p => p.ID.Equals(authorityID)); 

     // I can't do that because the relationship doesn't exist yet. 
     var agent = authority.Agents.Where(p => p.ID.Equals(agentID)); 


     authority.Agents.Add(agent); 

     dao.Attach(authority); 

     dao.SaveChanges(); 

    } 

我知道我可以在DAO做創建我的上下文,但我會制動模式,不會吧?

我該怎麼做上面的方法?

謝謝。

編輯:我發現了一個解決方案,但我不知道這是否是更好的方式來做到這一點:我創建了一個構造函數來我ConcreteDAO傳遞的ObjectContext和方法來讓我的對象上下文

GenericDAO.cs

public ObjectContext GetContext() 
{ 
    return _context; 
} 

ConcreteDAO.cs

public ConcreteDAO() 
{ 

} 

public ConcreteDAO(ObjectContext context) 
    : base(context) 
{ 
} 

和裏面我AuthorityDAO.cs

public static void InsertAgent(int authorityID, int agentID) 
{ 
    var dao = new ConcreteDAO<Authority>(); 
    Authority authority = dao.Single(p => p.ID.Equals(authorityID)); 
    dao.Attach(authority); 

    var daoAgent = new ConcreteDAO<Agent>(dao.GetContext()); 

    var agent = daoAgent.Single(p => p.ID == agentID); 

    authority.Agents.Add(agent); 

    dao.SaveChanges(); 
} 

回答

2

我想你,因爲你正在使用的存儲庫模式,而不單位工作模式有這個問題。您的ConcreteDAO<T>(=實體類型爲T的通用存儲庫,我想)不應創建上下文(=工作單元)。相反,您的消費方法應該明確地創建它並將其注入到所需的所有存儲庫中。然後,最後的方法是這樣的:

public static void InsertAgent(int authorityID, int agentID) 
{ 
    using (var unitOfWork = new UnitOfWork()) // unit of work = context 
    { 
     var daoAuthority = new ConcreteDAO<Authority>(unitOfWork); 
     var daoAgent = new ConcreteDAO<Agent>(unitOfWork); 

     var authority = daoAuthority.Single(p => p.ID.Equals(authorityID)); 
     var agent = daoAgent.Single(p => p.ID == agentID); 

     authority.Agents.Add(agent); 

     unitOfWork.SaveChanges(); 
    } 
} 

在不斷變化的關係涉及您需要一個以上的通用倉庫很多情況下,但所有工作必須在同一範圍內進行。

因爲您知道主鍵屬性並且不想更改實體本身而只是關係,所以您可以保存以從數據庫加載實體。在這種情況下,您可以用所附的「存根」實體合作:

public static void InsertAgent(int authorityID, int agentID) 
{ 
    using (var unitOfWork = new UnitOfWork()) 
    { 
     var daoAuthority = new ConcreteDAO<Authority>(unitOfWork); 
     var daoAgent = new ConcreteDAO<Agent>(unitOfWork); 

     var authority = new Authority { ID = authorityID, 
      Agents = new List<Agent>() }; 
     daoAuthority.Attach(authority); 

     var agent = new Agent { ID = agentID }; 
     daoAgent.Attach(agent); 

     authority.Agents.Add(agent); 

     unitOfWork.SaveChanges(); 
    } 
} 
+0

我很好奇什麼是「VAR daoAuthority =新ConcreteDAO (的UnitOfWork);」句法?我以前沒見過這個,也不知道該怎麼做(一個尾隨(unitOfWork)演員?) – mikey 2011-12-20 15:32:21

+0

謝謝@Slauma。我將在我的項目中實施此解決方案。這種方式比我想象的要好得多。 – cristiam 2011-12-20 15:32:30

+0

@mikey這是因爲我正在使用名爲Repository Pattern的模式。你可以在這裏看到更多:http://stackoverflow.com/questions/3175/repository-pattern-tutorial-in-c-sharp – cristiam 2011-12-20 15:34:15