Вопрос по c#, linq-to-sql, linq, sql-server, .net – База данных не обновляется методом Attach

1

Я пытаюсь выучить LINQ to SQL. Я успешно внедрил метод вставки, и данные вставляются в базу данных. Когда я пытаюсь обновить существующие данные, они не отражаются в базе данных, даже если нет исключений. Можете ли вы пролить свет на то, что могло пойти не так?

Примечание: AccountNumber является первичным ключом

EDIT

Следующие строки кода заставляют его работать. Но вы можете объяснитьwhy we need a refresh?

    accountRepository.UpdateChangesByAttach(acc1);
    accountRepository.RefreshEntity(acc1);
    accountRepository.SubmitChanges();

Замечания:

DataContext.Refresh method refreshes object state by using data in the database.

Обновление было сделано с опцией KeepCurrentValues. Я понимаю, что он сохранит значения, которые я обновил в объекте сущности. Я предоставляю (только) необходимую информацию, которую необходимо обновить в базе данных. Требуется ли это обновлениеto get the remaining column values?

клиент

using (var context = new   RepositoryLayer.LibraryManagementClassesDataContext(connectionstring)) 
   {
            context.Log = Console.Out;

            RepositoryLayer.Repository<RepositoryLayer.Account> selectedRepository = new RepositoryLayer.Repository<RepositoryLayer.Account>();
            //selectedRepository.Context = context;
            AccountBusiness accountBl = new AccountBusiness(selectedRepository);

            //Transaction 1
            //List<RepositoryLayer.Account> accountList = accountBl.GetAllAccounts();

            //Transaction 2
            //accountBl.InsertAccounts();

            //Transaction3
            accountBl.UpdateAccounts();


   }

Бизнес уровень

    public void  InsertAccounts()
    {
        RepositoryLayer.Account acc1 = new RepositoryLayer.Account();
        acc1.AccountNumber = 4;
        acc1.AccountType = "Contract";
        acc1.Duration = 6;

        accountRepository.InsertOnSubmit(acc1);
        accountRepository.SubmitChanges();

    }

    public void UpdateAccounts()
    {
        RepositoryLayer.Account acc1 = new RepositoryLayer.Account();
        acc1.AccountNumber = 4;
        acc1.AccountType = "TEST";
        acc1.Duration = 10;

        accountRepository.UpdateChangesByAttach(acc1);
        accountRepository.SubmitChanges();

    }

вместилище

public class Repository<T> : IRepository<T> where T : class
{
    public System.Data.Linq.DataContext Context
    {
        get;
        set;
    }

    public virtual System.Data.Linq.ITable GetTable()
    {
        return Context.GetTable<T>();
    }


    public virtual void InsertOnSubmit(T entity)
    {
        GetTable().InsertOnSubmit(entity);
    }

    public virtual void UpdateChangesByAttach(T entity)
    {
        GetTable().Attach(entity);
    }


    public virtual void SubmitChanges()
    {
        Context.SubmitChanges();
    }

    public virtual void RefreshEntity(T entity)
    {
        Context.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, entity);
    }


}

ЧТЕНИЕ

LINQ to SQL: Updating without Refresh when “UpdateCheck = Never”

Linq To SQL Attach/Refresh Entity Object

What does LINQ-to-SQL Table<T>.Attach do?

Why should I use GetOriginalEntityState() in my LINQ To SQL repository save method?

How can I reject all changes in a Linq to SQL's DataContext?

Ваш Ответ

2   ответа
0

Я сделал это, работая следующим образом. Но я все еще задаюсь вопросом, зачем нам нужно обновление, чтобы это работало. Можете ли вы объяснить это?

Добавлена функция в хранилище

    public virtual void RefreshEntity(T entity)
    {
        Context.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, entity);
    }

Звонок изменился как

    public void UpdateAccounts()
    {
        RepositoryLayer.Account acc1 = new RepositoryLayer.Account();
        acc1.AccountNumber = 4;
        acc1.AccountType = "TEST";
        acc1.Duration = 10;

        accountRepository.UpdateChangesByAttach(acc1);
        accountRepository.RefreshEntity(acc1);
        accountRepository.SubmitChanges();

    }
1

Это решено, следуя ответу в вопросеLINQ to SQL: обновление без обновления, когда & # x201C; UpdateCheck = Never & # x201D;.

Это не использует Refresh и нет оператора select до оператора update.

Похожие вопросы