Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 6b80ea5

Browse files
committed
2 parents 56104b7 + e75a1ae commit 6b80ea5

15 files changed

+848
-49
lines changed

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,11 @@ db.UpdateOnly(new Person { FirstName = "JJ" }, p => p.FirstName);
344344
```
345345
**UPDATE "Person" SET "FirstName" = 'JJ'**
346346

347+
```csharp
348+
db.UpdateOnly(new Person { FirstName = "JJ", Age = 12 }, p => new { p.FirstName, p.Age });
349+
```
350+
**UPDATE "Person" SET "FirstName" = 'JJ', "Age" = 12**
351+
347352
When present, the second expression is used as the where filter:
348353
```csharp
349354
db.UpdateOnly(new Person { FirstName = "JJ" }, p => p.FirstName, p => p.LastName == "Hendrix");
@@ -946,4 +951,10 @@ As [performance is the most important feature](https://github.com/mythz/ScalingD
946951
- Fast, supports dynamics and expandos, smart use of optional params to provide a wrist-friendly api, fits in a single class. Multiple RDBMS support. Requires .NET 4.
947952
* **[Simple.Data](https://github.com/markrendle/Simple.Data)** - by [@markrendle](http://twitter.com/markrendle)
948953
- A little slower than above ORMS, most wrist-friendly courtesy of a dynamic API, multiple RDBMS support inc. Mongo DB. Requires .NET 4.
949-
954+
955+
956+
# Community Resources
957+
958+
- [Simple ServiceStack OrmLite Example](http://www.curlette.com/?p=1068) by [@robrtc](https://twitter.com/robrtc)
959+
- [OrmLite Blobbing done with NHibernate and Serialized JSON](http://www.philliphaydon.com/2012/03/ormlite-blobbing-done-with-nhibernate-and-serialized-json/) by [@philliphaydon](https://twitter.com/philliphaydon)
960+
- [Creating An ASP.NET MVC Blog With ServiceStack.OrmLite](http://www.eggheadcafe.com/tutorials/asp-net/285cbe96-9922-406a-b193-3a0b40e31c40/creating-an-aspnet-mvc-blog-with-servicestackormlite.aspx) by [@peterbromberg](https://twitter.com/peterbromberg)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6+
<ProductVersion>12.0.0</ProductVersion>
7+
<SchemaVersion>2.0</SchemaVersion>
8+
<ProjectGuid>{E106F587-2DFF-4550-BA49-9A81A2EC344F}</ProjectGuid>
9+
<OutputType>Library</OutputType>
10+
<RootNamespace>ServiceStack.OrmLite.DDLTest</RootNamespace>
11+
<AssemblyName>ServiceStack.OrmLite.DDLTest</AssemblyName>
12+
</PropertyGroup>
13+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
14+
<DebugSymbols>True</DebugSymbols>
15+
<DebugType>full</DebugType>
16+
<Optimize>False</Optimize>
17+
<OutputPath>bin\Debug</OutputPath>
18+
<DefineConstants>DEBUG;</DefineConstants>
19+
<ErrorReport>prompt</ErrorReport>
20+
<WarningLevel>4</WarningLevel>
21+
<ConsolePause>False</ConsolePause>
22+
</PropertyGroup>
23+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
24+
<DebugType>none</DebugType>
25+
<Optimize>True</Optimize>
26+
<OutputPath>bin\Release</OutputPath>
27+
<ErrorReport>prompt</ErrorReport>
28+
<WarningLevel>4</WarningLevel>
29+
<ConsolePause>False</ConsolePause>
30+
</PropertyGroup>
31+
<ItemGroup>
32+
<Reference Include="System" />
33+
<Reference Include="nunit.framework">
34+
<HintPath>..\..\lib\tests\nunit.framework.dll</HintPath>
35+
</Reference>
36+
<Reference Include="FirebirdSql.Data.FirebirdClient">
37+
<HintPath>..\..\lib\FirebirdSql.Data.FirebirdClient.dll</HintPath>
38+
</Reference>
39+
<Reference Include="MySql.Data">
40+
<HintPath>..\..\lib\MySql.Data.dll</HintPath>
41+
</Reference>
42+
<Reference Include="ServiceStack.Common">
43+
<HintPath>..\..\lib\ServiceStack.Common.dll</HintPath>
44+
</Reference>
45+
<Reference Include="ServiceStack.Interfaces">
46+
<HintPath>..\..\lib\ServiceStack.Interfaces.dll</HintPath>
47+
</Reference>
48+
<Reference Include="ServiceStack.Text">
49+
<HintPath>..\..\lib\ServiceStack.Text.dll</HintPath>
50+
</Reference>
51+
<Reference Include="System.ComponentModel.DataAnnotations" />
52+
</ItemGroup>
53+
<ItemGroup>
54+
<Compile Include="Test.cs" />
55+
</ItemGroup>
56+
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
57+
<ItemGroup>
58+
<ProjectReference Include="..\ServiceStack.OrmLite\ServiceStack.OrmLite.csproj">
59+
<Project>{96179AC6-F6F1-40C3-9FDD-4F6582F54C5C}</Project>
60+
<Name>ServiceStack.OrmLite</Name>
61+
</ProjectReference>
62+
<ProjectReference Include="..\ServiceStack.OrmLite.Firebird\ServiceStack.OrmLite.Firebird.csproj">
63+
<Project>{317B64BA-D7A6-4A15-8719-821B38147C63}</Project>
64+
<Name>ServiceStack.OrmLite.Firebird</Name>
65+
</ProjectReference>
66+
<ProjectReference Include="..\ServiceStack.OrmLite.MySql\ServiceStack.OrmLite.MySql.csproj">
67+
<Project>{FD20F088-ACC0-4979-AC0C-8C541C2E7DE5}</Project>
68+
<Name>ServiceStack.OrmLite.MySql</Name>
69+
</ProjectReference>
70+
</ItemGroup>
71+
</Project>
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
using System;
2+
using NUnit.Framework;
3+
using ServiceStack.OrmLite;
4+
using ServiceStack.OrmLite.Firebird;
5+
using ServiceStack.OrmLite.MySql;
6+
using System.Collections.Generic;
7+
using ServiceStack.Logging;
8+
using ServiceStack.Logging.Support.Logging;
9+
using System.ComponentModel.DataAnnotations;
10+
11+
namespace ServiceStack.OrmLite.DDLTest
12+
{
13+
14+
15+
[TestFixture()]
16+
public class Test
17+
{
18+
List<Dialect> dialects = new List<Dialect>();
19+
20+
[TestFixtureSetUp]
21+
public void TestFixtureSetup()
22+
{
23+
dialects.Add ( new Dialect{
24+
Provider= FirebirdOrmLiteDialectProvider.Instance,
25+
AddColumnString="ALTER TABLE Model ADD Column1 VARCHAR(128) ;",
26+
AlterColumnString="ALTER TABLE Model ALTER Column2 VARCHAR(50) ;",
27+
ChangeColumnNameString="ALTER TABLE Model ALTER OldColumn3 TO Column3 ;",
28+
AddFKString="ALTER TABLE Child ADD CONSTRAINT JustOneFK FOREIGN KEY (IdModel) REFERENCES Model (Id) ON DELETE CASCADE ON UPDATE NO ACTION;",
29+
AddFKRestrictString="ALTER TABLE Child ADD CONSTRAINT JustOneMoreFK FOREIGN KEY (IdModel) REFERENCES Model (Id) ON UPDATE NO ACTION;",
30+
CreateIndexString="CREATE UNIQUE INDEX JustIndexOnColumn3 ON Model(Column3);"
31+
32+
});
33+
dialects.Add ( new Dialect{
34+
Provider= MySqlDialectProvider.Instance,
35+
AddColumnString="ALTER TABLE `Model` ADD COLUMN `Column1` VARCHAR(255) NULL;",
36+
AlterColumnString="ALTER TABLE `Model` MODIFY COLUMN `Column2` VARCHAR(50) NULL;",
37+
ChangeColumnNameString="ALTER TABLE `Model` CHANGE COLUMN `OldColumn3` `Column3` VARCHAR(255) NULL;",
38+
AddFKString="ALTER TABLE `Child` ADD CONSTRAINT `JustOneFK` FOREIGN KEY (`IdModel`) REFERENCES `Model` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION;",
39+
AddFKRestrictString="ALTER TABLE `Child` ADD CONSTRAINT `JustOneMoreFK` FOREIGN KEY (`IdModel`) REFERENCES `Model` (`Id`) ON DELETE RESTRICT ON UPDATE NO ACTION;",
40+
CreateIndexString="CREATE UNIQUE INDEX `JustIndexOnColumn3` ON `Model`(`Column3`);"
41+
});
42+
43+
LogManager.LogFactory = new ConsoleLogFactory();
44+
}
45+
46+
[Test()]
47+
public void CanAddColumn ()
48+
{
49+
var model = typeof(Model);
50+
51+
foreach (var d in dialects)
52+
{
53+
OrmLiteConfig.DialectProvider=d.Provider;
54+
var fielDef = ModelDefinition<Model>.Definition.GetFieldDefinition<Model> (f => f.Column1);
55+
Assert.AreEqual(d.AddColumnString, (d.Provider.ToAddColumnStatement(model, fielDef)));
56+
}
57+
}
58+
59+
[Test()]
60+
public void CanAAlterColumn ()
61+
{
62+
var model = typeof(Model);
63+
64+
foreach (var d in dialects)
65+
{
66+
OrmLiteConfig.DialectProvider=d.Provider;
67+
var fielDef = ModelDefinition<Model>.Definition.GetFieldDefinition<Model> (f => f.Column2);
68+
Assert.AreEqual(d.AlterColumnString, (d.Provider.ToAlterColumnStatement(model, fielDef)));
69+
}
70+
71+
}
72+
73+
74+
[Test()]
75+
public void CanChangeColumnName ()
76+
{
77+
var model = typeof(Model);
78+
79+
foreach (var d in dialects)
80+
{
81+
OrmLiteConfig.DialectProvider=d.Provider;
82+
var fielDef = ModelDefinition<Model>.Definition.GetFieldDefinition<Model> (f => f.Column3);
83+
Assert.AreEqual(d.ChangeColumnNameString,(d.Provider.ToChangeColumnNameStatement(model, fielDef,"OldColumn3")));
84+
85+
}
86+
87+
}
88+
89+
[Test()]
90+
public void CanAddForeignKey ()
91+
{
92+
93+
foreach (var d in dialects)
94+
{
95+
OrmLiteConfig.DialectProvider=d.Provider;
96+
Assert.AreEqual(d.AddFKString,
97+
d.Provider.ToAddForeignKeyStatement<Child,Model>(f=>f.IdModel,
98+
fk=>fk.Id,OnFkOption.NoAction,OnFkOption.Cascade, "JustOneFK"));
99+
}
100+
}
101+
102+
[Test()]
103+
public void CanAddForeignKeyRestrict ()
104+
{
105+
106+
foreach (var d in dialects)
107+
{
108+
OrmLiteConfig.DialectProvider=d.Provider;
109+
Assert.AreEqual(d.AddFKRestrictString,
110+
d.Provider.ToAddForeignKeyStatement<Child,Model>(f=>f.IdModel,
111+
fk=>fk.Id,OnFkOption.NoAction,OnFkOption.Restrict, "JustOneMoreFK"));
112+
}
113+
}
114+
115+
116+
[Test()]
117+
public void CanCreateIndex ()
118+
{
119+
120+
foreach (var d in dialects)
121+
{
122+
OrmLiteConfig.DialectProvider=d.Provider;
123+
Assert.AreEqual(d.CreateIndexString, d.Provider.ToCreateIndexStatement<Model>(f=>f.Column3, "JustIndexOnColumn3", true) );
124+
125+
}
126+
127+
}
128+
129+
130+
}
131+
132+
public class Model
133+
{
134+
public Model()
135+
{
136+
}
137+
public int Id { get; set; }
138+
public string Column1{ get; set; }
139+
[StringLength(50)]
140+
public string Column2{ get; set; }
141+
public string Column3{ get; set; }
142+
143+
}
144+
145+
public class Child
146+
{
147+
public Child(){}
148+
public int Id{ get; set;}
149+
public int IdModel{ get; set;}
150+
151+
}
152+
153+
public class Dialect
154+
{
155+
public IOrmLiteDialectProvider Provider { get; set; }
156+
public string AddColumnString { get; set; }
157+
public string AlterColumnString { get; set; }
158+
public string ChangeColumnNameString { get; set; }
159+
public string AddFKString { get; set; }
160+
public string AddFKRestrictString { get; set; }
161+
public string CreateIndexString { get; set; }
162+
163+
}
164+
}

src/ServiceStack.OrmLite.Firebird/FirebirdOrmLiteDialectProvider.cs

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public FirebirdOrmLiteDialectProvider(bool compactGuid)
4040
base.RealColumnDefinition= "FLOAT";
4141
base.DefaultStringLength=128;
4242
base.InitColumnTypeMap();
43+
DefaultValueFormat = " DEFAULT '{0}'";
4344
}
4445

4546
public override IDbConnection CreateConnection(string connectionString, Dictionary<string, string> options)
@@ -334,20 +335,15 @@ public override string ToCreateTableStatement(Type tableType)
334335
if (fieldDef.ForeignKey == null) continue;
335336

336337
var refModelDef = GetModel(fieldDef.ForeignKey.ReferenceType);
337-
338-
var modelName= modelDef.IsInSchema
339-
? modelDef.Schema + "_" + NamingStrategy.GetTableName(modelDef.ModelName)
340-
: NamingStrategy.GetTableName(modelDef.ModelName);
341-
342-
var refModelName= refModelDef.IsInSchema
343-
? refModelDef.Schema + "_" + NamingStrategy.GetTableName(refModelDef.ModelName)
344-
: NamingStrategy.GetTableName(refModelDef.ModelName);
345-
338+
346339
sbConstraints.AppendFormat(", \n\n CONSTRAINT {0} FOREIGN KEY ({1}) REFERENCES {2} ({3})",
347340
GetQuotedName(fieldDef.ForeignKey.GetForeignKeyName(modelDef, refModelDef, NamingStrategy, fieldDef)),
348341
GetQuotedColumnName(fieldDef.FieldName),
349342
GetQuotedTableName(refModelDef),
350343
GetQuotedColumnName(refModelDef.PrimaryKey.FieldName));
344+
345+
sbConstraints.Append(GetForeignKeyOnDeleteClause(fieldDef.ForeignKey));
346+
sbConstraints.Append(GetForeignKeyOnUpdateClause(fieldDef.ForeignKey));
351347
}
352348

353349
if (sbPk.Length !=0) sbColumns.AppendFormat(", \n PRIMARY KEY({0})", sbPk);
@@ -402,16 +398,16 @@ public override string GetColumnDefinition (string fieldName, Type fieldType,
402398

403399
var sql = new StringBuilder();
404400
sql.AppendFormat("{0} {1}", GetQuotedColumnName(fieldName), fieldDefinition);
405-
401+
402+
if (!string.IsNullOrEmpty(defaultValue))
403+
{
404+
sql.AppendFormat(DefaultValueFormat, defaultValue);
405+
}
406+
406407
if (!isNullable)
407408
{
408409
sql.Append(" NOT NULL");
409-
}
410-
411-
if (!string.IsNullOrEmpty(defaultValue))
412-
{
413-
sql.AppendFormat(DefaultValueFormat, defaultValue);
414-
}
410+
}
415411

416412
return sql.ToString();
417413
}
@@ -734,6 +730,59 @@ public override bool DoesTableExist(IDbCommand dbCmd, string tableName)
734730
return result > 0;
735731
}
736732

733+
734+
public override string GetForeignKeyOnDeleteClause(ForeignKeyConstraint foreignKey)
735+
{
736+
return (!string.IsNullOrEmpty(foreignKey.OnDelete) && foreignKey.OnDelete.ToUpper()!="RESTRICT" )? " ON DELETE " + foreignKey.OnDelete : "";
737+
}
738+
739+
public override string GetForeignKeyOnUpdateClause(ForeignKeyConstraint foreignKey)
740+
{
741+
return (!string.IsNullOrEmpty(foreignKey.OnUpdate) && foreignKey.OnUpdate.ToUpper()!="RESTRICT" )? " ON UPDATE " + foreignKey.OnUpdate : "";
742+
}
743+
744+
#region DDL
745+
public override string ToAddColumnStatement(Type modelType, FieldDefinition fieldDef){
746+
747+
var column = GetColumnDefinition(fieldDef.FieldName,
748+
fieldDef.FieldType,
749+
fieldDef.IsPrimaryKey,
750+
fieldDef.AutoIncrement,
751+
fieldDef.IsNullable,
752+
fieldDef.FieldLength,
753+
fieldDef.Scale,
754+
fieldDef.DefaultValue);
755+
return string.Format("ALTER TABLE {0} ADD {1} ;",
756+
GetQuotedTableName(GetModel(modelType).ModelName),
757+
column);
758+
}
759+
760+
public override string ToAlterColumnStatement(Type modelType, FieldDefinition fieldDef)
761+
{
762+
763+
var column = GetColumnDefinition(fieldDef.FieldName,
764+
fieldDef.FieldType,
765+
fieldDef.IsPrimaryKey,
766+
fieldDef.AutoIncrement,
767+
fieldDef.IsNullable,
768+
fieldDef.FieldLength,
769+
fieldDef.Scale,
770+
fieldDef.DefaultValue);
771+
return string.Format("ALTER TABLE {0} ALTER {1} ;",
772+
GetQuotedTableName(GetModel(modelType).ModelName),
773+
column);
774+
}
775+
776+
public override string ToChangeColumnNameStatement(Type modelType,
777+
FieldDefinition fieldDef,
778+
string oldColumnName)
779+
{
780+
return string.Format("ALTER TABLE {0} ALTER {1} TO {2} ;",
781+
GetQuotedTableName(GetModel(modelType).ModelName),
782+
GetQuotedColumnName(oldColumnName),
783+
GetQuotedColumnName(fieldDef.FieldName));
784+
}
785+
#endregion DDL
737786
}
738787
}
739788

0 commit comments

Comments
 (0)