I m 试图利用微软服务器2008 R2与实体框架4.0之间的SNAPSHOT交易孤立水平。 然而,这似乎像我最初认为的那样容易。
为了使用SNAPSHOT的隔离水平,必须使该系统能够进入数据库。 我这样做了。 我通过利用Salk管理演播室测试,SNAPSHOT的隔离水平在我的数据库中发挥了预期的作用。 我想利用这一孤立程度,因为我希望始终如一地理解,而不要锁定行或整个桌子。 因此,我的数据库可供我使用SNAPSHOT的孤立程度。 迄今情况良好。
在我重新提出的申请中,我有一个窗口,在申请中,我把一些数据从一个表格上载。 每次我点击一个 but子时,我装上5个牢房。 窗口是XAML:
<Window x:Class="EFSnapshotTransactionTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Name="UC" Closing="UC_Closing">
<DockPanel>
<Button Click="Button_Click" DockPanel.Dock="Top">Load next 5</Button>
<ScrollViewer>
<ListView ItemsSource="{Binding ElementName=UC, Path=ViewModel.Items}">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/>
<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Date}"/>
<GridViewColumn Header="DocumentNumber" DisplayMemberBinding="{Binding DocumentNumber}"/>
<GridViewColumn Header="Amount" DisplayMemberBinding="{Binding Amount}"/>
<GridViewColumn Header="Text" DisplayMemberBinding="{Binding Text}"/>
</GridView>
</ListView.View>
</ListView>
</ScrollViewer>
</DockPanel>
这是窗户的密码:
public partial class MainWindow : Window
{
private ViewModel _vm;
public ViewModel ViewModel
{
get { return _vm; }
}
public MainWindow()
{
_vm = new ViewModel();
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
_vm.LoadNextItems(5);
}
private void UC_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
_vm.Dispose();
}
这里无所不知。 现在,《守则》要看模式,即行动发生地。
public class ViewModel : INotifyPropertyChanged, IDisposable
{
private ObservableCollection<Posting> _items;
private SentaFinancialsEntities _db;
private DbTransaction _dbTrans;
public ObservableCollection<Posting> Items
{
get { return _items; }
set
{
_items = value;
OnPropertyChanged("Items");
}
}
public ViewModel()
{
_items = new ObservableCollection<Posting>();
_db = new SentaFinancialsEntities();
_db.Connection.Open();
_dbTrans = _db.Connection.BeginTransaction(System.Data.IsolationLevel.Snapshot);
}
public void LoadNextItems(int count)
{
int startAt = _items.Count;
var dbPostings = (from b in _db.Postings
select b).OrderBy(b => b.Dato).Skip(startAt).Take(count);
foreach (var singleDbPosting in dbPostings)
{
Posting dto = new Posting(singleDbPosting);
_items.Add(dto);
}
}
public void Dispose()
{
_dbTrans.Commit();
_dbTrans.Dispose();
_db.Dispose();
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我试图在此做的是打开数据库的链接并保持开放。 我试图开始交易,并要求将SNAPSHOT与外界隔绝。 这样,我就可以在打开窗户时阅读5个行文,并接上这些行文,即使有人在窗户开放时会ed、删除或插入行文。 但是,当我用车库简介仪进行追踪时,在窗口开放或我装满时,没有开始交易,也没有确定我要求的孤立程度。 当窗户开放时,建立了联系,实体框架将交易孤立程度设定为READ COMMITTED,这是违约的孤立程度。 如果我使用翻译系统而不是翻译,情况也是如此(即无)。
因此,我的问题是:如果我的窗口开放,我怎么能够开始与SNAPSHOT的孤立水平交易,并保持开放。 交易的开放是绝对必要的,因此我可以不阅读其他用户在时间上增加的数据。
我知道,我可以与原指挥部一道这样做,但我希望尽可能避免这种情况。
副作用:人们对于不同程度的孤立存在不同的看法,但问题不是讨论SNAPSHOT的孤立程度是否与本案相比。 《SNAPSHOT》非常符合我们对这项任务的商业要求。 真正的问题可能是任何其他孤立程度,而其他孤立程度也不符合这一守则。