Как я могу получить значение первичного ключа, когда я вставляю новую запись?

В приведенном ниже коде настройка callback_policy для элемента слайдера работает, но только в одном направлении: от «mouseup» до «throttle». Установка его обратно в «mouseup» не имеет никакого эффекта. Может быть, это ошибка в Bokeh v1.0.4 или, возможно, следует манипулировать некоторыми другими атрибутами в модели BokehJS.

from bokeh.layouts import column
from bokeh.models.callbacks import CustomJS
from bokeh.models.sources import ColumnDataSource
from bokeh.models.widgets import Slider, RadioButtonGroup
from bokeh.plotting import curdoc

source = ColumnDataSource(data = dict(value = []))

def cb(attr, old, new): 
    print("UPDATE", source.data['value'])

source.on_change('data', cb)

mode_select_callback = CustomJS(code = """
    var slider = Bokeh.documents[0].get_model_by_name('my_slider')
    if (cb_obj.active == 1)
        slider.callback_policy = "mouseup"
    else (cb_obj.active == 0)
        slider.callback_policy = "throttle" """)

modeSelect = RadioButtonGroup(labels = ["continuous", "on release"], active = 1, button_type = 'default', width = 300)
modeSelect.callback = mode_select_callback
slider = Slider(start = 1, end = 10, value = 1, step = 0.1, callback_policy = 'mouseup', width = 200, name = 'my_slider')
slider.callback = CustomJS(args = dict(source = source), code = "source.data = { value: [cb_obj.value] }")

curdoc().add_root(column(modeSelect, slider))

В этом случае самым простым обходным решением будет динамическое создание и удаление ползунка с другой callback_policy. См. Упрощенный пример ниже (Bokeh v1.0.4)

from bokeh.layouts import column
from bokeh.models.callbacks import CustomJS
from bokeh.models.sources import ColumnDataSource
from bokeh.models.widgets import Slider, RadioButtonGroup
from bokeh.plotting import curdoc

layout = column()

def create_slider(callback_policy):
    slider = Slider(start = 1, end = 10, value = 1, step = 0.1, callback_policy = callback_policy, width = 200)
    slider.callback = CustomJS(args = dict(source = source), code = "source.data = { value: [cb_obj.value] }")
    return slider

def cb(attr, old, new): print("UPDATE", source.data['value'])

source = ColumnDataSource(data = dict(value = []))
source.on_change('data', cb)
slider = create_slider(callback_policy = 'mouseup')

def changeMode(attr, old, new):
    global slider
    if modeSelect.active == 0:
        layout.children.remove(slider)
        slider = create_slider(callback_policy = 'throttle')
        layout.children.append(slider)
    else:
        layout.children.remove(slider)
        slider = create_slider(callback_policy = 'mouseup')
        layout.children.append(slider)

modeSelect = RadioButtonGroup(labels = ["continuous", "on release"], active = 1, button_type = 'default', width = 300)
modeSelect.on_change('active', changeMode)

layout.children.append(modeSelect)
layout.children.append(slider)
curdoc().add_root(layout)

Оба примера должны выполняться с bokeh serve --show app.py

7
задан harshalb 25 April 2009 в 06:20
поделиться

6 ответов

yes (Assuming it is an identity field).

Calling InsertOnSubmit alone doesn't send the insert to the db. You need to call SubmitChanges in order for any changes in the current datacontext instance to be sent to the db.

After you have called SubmitChanges, you can access the values from the instance you used when calling InsertOnSubmit. Linq to sql will populate those values for you when doing the insert (which occurs during SubmitChanges)

Check this example: http://msdn.microsoft.com/en-us/vbasic/bb737920.aspx#dynid

8
ответ дан 6 December 2019 в 08:45
поделиться

Если модель настроена правильно, PK должен автоматически устанавливаться на затронутый объект (тот, который вы только что вставили).

HTH.

Сет

1
ответ дан 6 December 2019 в 08:45
поделиться

In short, you don't need to. The object itself is updated.

    public void Add(Person person)
    {
        using (MyEntities context = new MyEntities())
        {
            Context.Persons.InsertOnSaveChanges(person);
            Context.SaveChanges();
        }
    }

    public void Foo()
    {
        Person p = new Person { name = "John", age = 20 }
        Add(p);
        Int32 id = p.id;  // id contains the newly inserted object's id
    }
7
ответ дан 6 December 2019 в 08:45
поделиться

Here's an example of how that works:

var dc = new MyDataContext();
var cust = new Customer{FirstName="John", LastName="Smith"};
dc.Customer.InsertOnSubmit(cust);
dc.SubmitChanges();
//after SubmitChanges(), the Id is filled from the database
var customerPrimaryKey = cust.Id;
4
ответ дан 6 December 2019 в 08:45
поделиться

Как только вы вызвали InserOnSubmit (), значение первичного ключа устанавливается для соответствующих полей в табличном объекте. Вы можете просто получить доступ к этому свойству, чтобы получить первичный ключ.

1
ответ дан 6 December 2019 в 08:45
поделиться

Вы вызываете SubmitChanges () для своего контекста данных после вставки записи? Набор изменений не будет оцениваться, пока вы не сделаете это.

0
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

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