我們有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();
}
我很好奇什麼是「VAR daoAuthority =新ConcreteDAO(的UnitOfWork);」句法?我以前沒見過這個,也不知道該怎麼做(一個尾隨(unitOfWork)演員?) –
mikey
2011-12-20 15:32:21
謝謝@Slauma。我將在我的項目中實施此解決方案。這種方式比我想象的要好得多。 – cristiam 2011-12-20 15:32:30
@mikey這是因爲我正在使用名爲Repository Pattern的模式。你可以在這裏看到更多:http://stackoverflow.com/questions/3175/repository-pattern-tutorial-in-c-sharp – cristiam 2011-12-20 15:34:15