[英]How to access navigation properties in EF using repository pattern
上下文:ASP.NET Web應用程序
基本存儲庫(抽象類)實現了所有其他存儲庫都將從其繼承的必需的基本功能:即-PersonRepo -AddressRepo
編輯:您將查詢幾個數據庫表的代碼放在何處,而其中一些與導航屬性沒有直接關系,分別位於相應的存儲庫中?
現在,訪問導航屬性的最佳方法是什么? 使用存儲庫模式時非常麻煩。 如果沒有方便的解決方案,我將保留所有內部內容並保留舊的DAL層,然后直接使用DbContext。
我只是想出一個臨時解決方案來訪問我的PersonRepository實現中的導航屬性:
public Person InsertNewPersonWithAddress(Person p, Address addr)
{
this.Insert(p); // insert person
var ar = new AddressRepository(this.ctx);
ar.Insert(addr); // insert address
this.Addresses(p).Add(addr); // add address to person
return p;
}
/* Navigation Properties */
ICollection<Address> Addresses(Person p)
{
return ctx.Entry<Person>(p).Collection<Address>("Addresses").CurrentValue;
}
基本存儲庫類實現以下接口
public interface IRepository<T> where T : class
{
IQueryable<T> All();
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
T Insert(T entity);
IEnumerable<T> InsertMultiple(IEnumerable<T> items);
T Delete(T entity);
IEnumerable<T> DeleteMultiple(IEnumerable<T> items);
T Update(T entity);
IEnumerable<T> UpdateMultiple(IEnumerable<T> items);
void Save();
}
DB-設計:
人員->人員地址(連接表)<-地址
任何智能解決此問題的方法?
您在想這是錯誤的方式。 Navigation屬性是Entity的屬性,而不是Repository的屬性。 您無需為導航屬性實例化存儲庫,可以將其直接添加到實體。
public Person InsertNewPersonWithAddress(Person p, Address addr)
{
p.Address = addr;
this.Insert(p); // insert person
return p;
}
現在,如果要插入新的Person
但希望將其附加到現有Address
(而不是插入兩者的新副本),則可以將AddressId
FK公開為Person
Entity上的屬性,並傳遞FK
值來執行鏈接。 無論哪種情況,此存儲庫都不需要訪問另一個存儲庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.