Skip to content

Commit d2c6796

Browse files
committed
Fix for issue ThatRendle#178
1 parent 782ea4c commit d2c6796

4 files changed

Lines changed: 31 additions & 5 deletions

File tree

Simple.Data.Ado/Schema/DatabaseSchema.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ public IEnumerable<Table> Tables
4444
get { return _lazyTables.Value.AsEnumerable(); }
4545
}
4646

47+
public bool IsTable(string name)
48+
{
49+
try
50+
{
51+
var table = FindTable(name);
52+
return table != null;
53+
}
54+
catch (UnresolvableObjectException)
55+
{
56+
return false;
57+
}
58+
}
4759
public Table FindTable(string tableName)
4860
{
4961
if (!string.IsNullOrWhiteSpace(DefaultSchema) && !(tableName.Contains(".")))

Simple.Data.Ado/UpdateHelper.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public ICommandBuilder GetUpdateCommand(string tableName, IDictionary<string, ob
3232
if (criteria != null )
3333
{
3434
string whereStatement = null;
35-
if (criteria.GetOperandsOfType<ObjectReference>().Any(o => !o.GetOwner().GetName().Equals(tableName)))
35+
if (criteria.GetOperandsOfType<ObjectReference>().Any(o => IsTableChain(tableName, o)))
3636
{
3737
if (table.PrimaryKey.Length == 1)
3838
{
@@ -54,6 +54,12 @@ public ICommandBuilder GetUpdateCommand(string tableName, IDictionary<string, ob
5454
return _commandBuilder;
5555
}
5656

57+
private bool IsTableChain(string tableName, ObjectReference o)
58+
{
59+
var ownerName = tableName.Contains(".") ? o.GetOwner().GetAllObjectNamesDotted() : o.GetOwner().GetName();
60+
return (!ownerName.Equals(tableName, StringComparison.InvariantCultureIgnoreCase)) && _schema.IsTable(ownerName);
61+
}
62+
5763
private string CreateWhereInStatement(SimpleExpression criteria, Table table)
5864
{
5965
var inClauseBuilder = new CommandBuilder(_schema);

Simple.Data.SqlServer/SqlSchemaProvider.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,9 @@ private DataTable GetForeignKeys()
176176

177177
private DataTable GetPrimaryKeys(string tableName)
178178
{
179-
return GetPrimaryKeys().AsEnumerable()
180-
.Where(
181-
row => row["TABLE_NAME"].ToString().Equals(tableName, StringComparison.InvariantCultureIgnoreCase))
182-
.CopyToDataTable();
179+
var primaryKeys = GetPrimaryKeys();
180+
var dataTable = primaryKeys.AsEnumerable().Where(row => row["TABLE_NAME"].ToString().Equals(tableName, StringComparison.InvariantCultureIgnoreCase)).CopyToDataTable();
181+
return dataTable;
183182
}
184183

185184
private EnumerableRowCollection<DataRow> GetForeignKeys(string tableName)

Simple.Data.SqlTest/UpdateTests.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@ public void TestUpdateWithJoinCriteria()
9696
Assert.AreEqual("Updated", customer.Name);
9797
}
9898

99+
[Test]
100+
public void TestUpdateAllWithNoMatchingRows()
101+
{
102+
var db = DatabaseHelper.Open();
103+
db.test.SchemaTable.UpdateAll(db.test.SchemaTable.Id == 1138, Description: "Updated");
104+
var test = db.test.SchemaTable.FindById(1138);
105+
Assert.IsNull(test);
106+
}
107+
99108
[Test]
100109
public void TestUpdateWithJoinCriteriaOnCompoundKeyTable()
101110
{

0 commit comments

Comments
 (0)