亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的實體被多個 IEntityChangeTracker 實例引用?

為什么我的實體被多個 IEntityChangeTracker 實例引用?

C#
HUH函數 2022-10-23 13:41:42
我正在嘗試通過將我的 DbContext 注入服務類來在我的 ASP.NET Web 窗體項目中實現現代實踐(使用服務、IoC 等),但我一直收到一條錯誤消息An entity object cannot be referenced by multiple instances of IEntityChangeTracker.這讓我很困惑,因為我相對確定我只有一個 DbContext 跟蹤更改。有什么問題?我正在使用將 DbContext 作為函數參數發送到的靜態類,但除此之外,我沒有在頁面端進行任何更改...public partial class Create : System.Web.UI.Page{    private LicenseService licenseService;    private ApplicationDbContext context = new ApplicationDbContext();    protected void Page_Load(object sender, EventArgs e)    {        try        {            licenseService = new LicenseService(context);        }        catch (Exception ex)        {            // TODO Add error handling/logging.            ErrorMessage.Text = ex.Message;        }    }    protected void Page_LoadComplete(object sender, EventArgs e)    {        this.context.Dispose();    }    protected async void Save_Click(object sender, EventArgs e)    {        try        {            var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();            var user = await userManager.FindByIdAsync(User.Identity.GetUserId());            await SaveLicenseAsync(user);            // Show a message that the work was done.            ShowSnackbar("License was successfully added; redirecting...", "Default");        }        catch (Exception ex)        {            // TODO Add error handling/logging.            ErrorMessage.Text = ex.Message;        }    }    private async Task SaveLicenseAsync(ApplicationUser user)    {        // Get the specified expiry date.        DateTime.TryParse(ExpiryDatePicker.SelectedDate.ToString(), out DateTime expiryDate);        // Create the viewmodel that will be passed to the service.        var model = new LicenseViewModel        {            ExpiryDate = expiryDate,            Name = NameTextBox.Text        };        await licenseService.AddAsync(model, user);    }}我的服務通常包含與 EF 的所有交互。我喜歡這個,因為它將頁面與 DbContext 邏輯分開。
查看完整描述

1 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

問題將與您在許可證中的用戶參考有關。這是從 Owin 上下文中檢索到的,但您正在嘗試將其保存/關聯到您的許可證上下文。


我將更新該方法以簡單地接受用戶 ID,然后從您的許可證上下文加載并關聯用戶。


public async Task AddRangeAsync(IEnumerable<LicenseViewModel> models, int ownerId)

{

    var list = new List<License>();

    var owner = context.Users.Single(x => x.UserId == ownerId);

    foreach (var model in models)

    {

        list.Add(new License

        {

            ExpiryDate = model.ExpiryDate,

            Name = model.Name,

            User = owner

        });

    }

    context.Licenses.AddRange(list);

    await context.SaveChangesAsync();

}

那應該可以解決您的問題。偷偷摸摸的小細節。:)


為了避免負載,您可以使用:


var owner = context.Owners.Local.SingleOrDefault(x => x.UserId == ownerId);

if (owner == null)

{

    owner = new User{UserId = ownerId};

    context.Users.Attach(owner);

}

// ...

我可能會考慮將其放在基類方法中以從上下文中檢索所有者引用。該方法的警告是,除非您從數據庫顯式加載,否則此上下文中的用戶將不包含有關用戶的詳細信息。(即名稱等)因此,只要團隊知道不相信上下文將具有完整的用戶,除非明確重新加載,就可以從性能 PoV 中獲得。


查看完整回答
反對 回復 2022-10-23
  • 1 回答
  • 0 關注
  • 110 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號