Note that there are some explanatory texts on larger screens.

plurals
  1. POUpdate object in Entity Framework
    text
    copied!<pre><code>public class SqlDataContext : DbContext { public DbSet&lt;Message&gt; Messages { get; set; } protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } } </code></pre> <p>and repository class:</p> <pre><code> public class SqlRepository : IRepository { private SqlDataContext _dataContext; public SqlRepository(SqlDataContext dataContext) { _dataContext = dataContext; } public DbSet&lt;Message&gt; Messages { get { return _dataContext.Messages; } } public void Commit() { _dataContext.SaveChanges(); } } </code></pre> <p>and service class:</p> <pre><code>public class MessagesServices : IMessagesServices { #region Repository private IRepository _repository; public UsersServices(IRepository repository) { _repository = repository; } #endregion /// &lt;summary&gt; /// Update the Message in Repository /// &lt;/summary&gt; public void Update(Message message) { if (message != null) { _repository.Messages.Attach(message); _repository.Commit(); } } } </code></pre> <p>If i get any message like this:</p> <pre><code>public ViewResult Edit(int messageId) { var message = _repository.Messages.First(j =&gt; j.MessageId == messageId); message.Text = "Test"; _userService.Update(message); } </code></pre> <p>Everything will be okay, but the changes are not saved to the database.</p> <p>Message Controller constructor</p> <pre><code>private IRepository _repository; private IMessagesServices _messageServices; public MessagesController(IRepository repository, IMessagesServices messageServices) { _repository = repository; _messageServices = messageServices; } </code></pre> <p>repository, service and data context are injected by stucture map:</p> <pre><code>/// &lt;summary&gt; /// Configuration registry modules for DI /// &lt;/summary&gt; public class WebUiRegistry : Registry { public WebUiRegistry() { For&lt;DbContext&gt;().Use(() =&gt; new SqlDataContext()); For&lt;IRepository&gt;().HttpContextScoped().Use&lt;SqlRepository&gt;(); For&lt;IUsersServices&gt;().Use&lt;UsersServices&gt;(); For&lt;IMessagesServices&gt;().Use&lt;MessagesServices&gt;(); For&lt;IJobAdvertsServices&gt;().Use&lt;JobAdvertsServices&gt;(); For&lt;ILog&gt;().Use&lt;SqlLogServices&gt;(); } } </code></pre> <p>@slauma You have right.</p> <p>If i try this: </p> <pre><code>ObjectFactory.GetInstance&lt;SqlDataContext&gt;().Messages.Attach(message); ObjectFactory.GetInstance&lt;SqlDataContext&gt;().Entry(message).State = EntityState.Modified; ObjectFactory.GetInstance&lt;SqlDataContext&gt;().SaveChanges(); </code></pre> <p>Them all works fine, so i have multiple instance of SqlDataContext.</p> <p>But this:</p> <pre><code>For&lt;SqlDataContext&gt;().Use(() =&gt; new SqlDataContext()); </code></pre> <p>don't help. Any idea?</p> <p>I think, problem is here</p> <pre><code>private IRepository _repository; private IMessagesServices _messageServices; public MessagesController(IRepository repository, IMessagesServices messageServices) { _repository = repository; _messageServices = messageServices; } </code></pre> <p>Because repository is here injected (inside repository is injected SqlDataContext) and in same moment is injected services (inside injected repository, in repository SqlDataContext)</p> <pre><code>public class MessageController : Controller { private IRepository _repository; private IMessagesServices _messagesServices; public MessageController(IRepository repository, IMessagesServices messagesServices) { _repository = repository; _messagesServices = messagesServices; bool sameDataContexts = object.ReferenceEquals(((SqlRepository)_repository)._dataContext, ((SqlRepository)((MessagesServices)_messagesServices)._repository)._dataContext); } </code></pre> <p>result is TRUE.</p> <p>WORKING Solution:</p> <pre><code>private IRepository _repository; private IMessagesServices _messageServices; public MessagesController(IRepository repository) { _repository = repository; _messageServices = ObjectFactory.GetInstance&lt;IUsersServices&gt;(); } </code></pre> <p>and in services class:</p> <pre><code>/// &lt;summary&gt; /// Update the Message in Repository /// &lt;/summary&gt; public void Update(Message message) { if (message != null) { _repository.Messages.Attach(message); ObjectFactory.GetInstance&lt;SqlDataContext&gt;().Entry(message).State = EntityState.Modified; _repository.Commit(); } </code></pre> <p>But i here any solution for two constructor parameters ? And non-using </p> <pre><code>ObjectFactory.GetInstance&lt;SqlDataContext&gt;().Entry(message).State = EntityState.Modified; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload