簡體   English   中英

如何使用存儲庫模式訪問EF中的導航屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM