かをデータベースのテーブルからC#の授業で
-
09-06-2019 - |
質問
を使うための自動生成データベースのテーブルの指定された。私は、全体の持続層を持っているデータアクセス-ソリューションを使用していますが、それにしても、い店がたくさんの情報から多数のクラスとないんですけいただきました全てのこれらのテーブルです。例えば、以下のクラス:
class Foo
{
private string property1;
public string Property1
{
get { return property1; }
set { property1 = value; }
}
private int property2;
public int Property2
{
get { return property2; }
set { property2 = value; }
}
}
い、以下のSQL:
CREATE TABLE Foo
(
Property1 VARCHAR(500),
Property2 INT
)
しいと思いますがどんな風に使用されることになった複雑な種類です。例えば、引用されたクラスの場合、変更いたしましたそのとおりです。
class Foo
{
private string property1;
public string Property1
{
get { return property1; }
set { property1 = value; }
}
private System.Management.ManagementObject property2;
public System.Management.ManagementObject Property2
{
get { return property2; }
set { property2 = value; }
}
}
どのようにしたら良いですか対応す。
私ための自動のデータベースのスクリプトにより自分を反射列挙を通じて各クラスについては、その物性、無骨の複雑なデータ型を持っstumped.
解決
でも遅く、間約10分このため、非常にずさんなしではやめまいを起点:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace TableGenerator
{
class Program
{
static void Main(string[] args)
{
List<TableClass> tables = new List<TableClass>();
// Pass assembly name via argument
Assembly a = Assembly.LoadFile(args[0]);
Type[] types = a.GetTypes();
// Get Types in the assembly.
foreach (Type t in types)
{
TableClass tc = new TableClass(t);
tables.Add(tc);
}
// Create SQL for each table
foreach (TableClass table in tables)
{
Console.WriteLine(table.CreateTableScript());
Console.WriteLine();
}
// Total Hacked way to find FK relationships! Too lazy to fix right now
foreach (TableClass table in tables)
{
foreach (KeyValuePair<String, Type> field in table.Fields)
{
foreach (TableClass t2 in tables)
{
if (field.Value.Name == t2.ClassName)
{
// We have a FK Relationship!
Console.WriteLine("GO");
Console.WriteLine("ALTER TABLE " + table.ClassName + " WITH NOCHECK");
Console.WriteLine("ADD CONSTRAINT FK_" + field.Key + " FOREIGN KEY (" + field.Key + ") REFERENCES " + t2.ClassName + "(ID)");
Console.WriteLine("GO");
}
}
}
}
}
}
public class TableClass
{
private List<KeyValuePair<String, Type>> _fieldInfo = new List<KeyValuePair<String, Type>>();
private string _className = String.Empty;
private Dictionary<Type, String> dataMapper
{
get
{
// Add the rest of your CLR Types to SQL Types mapping here
Dictionary<Type, String> dataMapper = new Dictionary<Type, string>();
dataMapper.Add(typeof(int), "BIGINT");
dataMapper.Add(typeof(string), "NVARCHAR(500)");
dataMapper.Add(typeof(bool), "BIT");
dataMapper.Add(typeof(DateTime), "DATETIME");
dataMapper.Add(typeof(float), "FLOAT");
dataMapper.Add(typeof(decimal), "DECIMAL(18,0)");
dataMapper.Add(typeof(Guid), "UNIQUEIDENTIFIER");
return dataMapper;
}
}
public List<KeyValuePair<String, Type>> Fields
{
get { return this._fieldInfo; }
set { this._fieldInfo = value; }
}
public string ClassName
{
get { return this._className; }
set { this._className = value; }
}
public TableClass(Type t)
{
this._className = t.Name;
foreach (PropertyInfo p in t.GetProperties())
{
KeyValuePair<String, Type> field = new KeyValuePair<String, Type>(p.Name, p.PropertyType);
this.Fields.Add(field);
}
}
public string CreateTableScript()
{
System.Text.StringBuilder script = new StringBuilder();
script.AppendLine("CREATE TABLE " + this.ClassName);
script.AppendLine("(");
script.AppendLine("\t ID BIGINT,");
for (int i = 0; i < this.Fields.Count; i++)
{
KeyValuePair<String, Type> field = this.Fields[i];
if (dataMapper.ContainsKey(field.Value))
{
script.Append("\t " + field.Key + " " + dataMapper[field.Value]);
}
else
{
// Complex Type?
script.Append("\t " + field.Key + " BIGINT");
}
if (i != this.Fields.Count - 1)
{
script.Append(",");
}
script.Append(Environment.NewLine);
}
script.AppendLine(")");
return script.ToString();
}
}
}
私はこれらのクラスで組立を試験す:
public class FakeDataClass
{
public int AnInt
{
get;
set;
}
public string AString
{
get;
set;
}
public float AFloat
{
get;
set;
}
public FKClass AFKReference
{
get;
set;
}
}
public class FKClass
{
public int AFKInt
{
get;
set;
}
}
を行っていることを明らかにし、以下のSQL:
CREATE TABLE FakeDataClass
(
ID BIGINT,
AnInt BIGINT,
AString NVARCHAR(255),
AFloat FLOAT,
AFKReference BIGINT
)
CREATE TABLE FKClass
(
ID BIGINT,
AFKInt BIGINT
)
GO
ALTER TABLE FakeDataClass WITH NOCHECK
ADD CONSTRAINT FK_AFKReference FOREIGN KEY (AFKReference) REFERENCES FKClass(ID)
GO
への想い...私の追加を検討属性などSqlTable]をクラス、それだけ発生のテーブルの授業をしています。また、この洗浄が可能で、トンバグが修正された(FKのチェッカーはジョーク)などなど...できます。
他のヒント
@ジョナサン-オランダ
なんと、それでいいんじゃないので原作から入れStackOverflowます。よくできました。 しかし, ではなく、構築で異文字列として、絶対に使用し SQLサーバーの管理オブジェ 授業に導入されたSQL2005年.
David Haydenは人の このように作成されたテーブルにはSQL Server2005を使用(C#、SQLサーバーの管理オブジェクト(SMO)-コード生成 散策をどのようにテーブルを作成する使用SMO.の強い型のオブジェで簡単という方法:
// Create new table, called TestTable
Table newTable = new Table(db, "TestTable");
や
// Create a PK Index for the table
Index index = new Index(newTable, "PK_TestTable");
index.IndexKeyType = IndexKeyType.DriPrimaryKey;
VanOrmanであれば、SQL、2005年に非公開としてSMOの一部。
みっCreateSchemaがある一方、オブジェクトで http://createschema.codeplex.com/
で文字列を返しまのためのanyオブジェクトを含むこのように作成されたテーブルのイントロダクションです。
することもあるかと思い複雑なデータ型、拡張によって指定ToDB()メソッドを持つ独自の実装を作成テーブルのDBは、このようなオート列に変換します。
としての2016年だと思い、利用者の枠組み6コードの最初の発生のSQLスキーマからはpoco c#の授業利用のデータベースの最初の発生のc#コードからsql.コードの最初のDBウォークスルー
複合型の場合は、再帰的に変換れるしたがって、テーブルにそれ自身のその後を管理外部キー関係。
また事前指定 る 授業はなに変換されます。複雑なデータを希望されるデータベースなお腹の張のスキーマを利用してもいいでしょう、または、それ以上のテーブルのための雑種類です。この例として4:
CREATE TABLE MiscTypes /* may have to include standard types as well */
( TypeID INT,
TypeName VARCHAR(...)
)
CREATE TABLE MiscProperties
( PropertyID INT,
DeclaringTypeID INT, /* FK to MiscTypes */
PropertyName VARCHAR(...),
ValueTypeID INT /* FK to MiscTypes */
)
CREATE TABLE MiscData
( ObjectID INT,
TypeID INT
)
CREATE TABLE MiscValues
( ObjectID INT, /* FK to MiscData*/
PropertyID INT,
Value VARCHAR(...)
)
まれに対して、データベースのテーブルのC#の授業はこちらhttp://pureobjects.com/dbCode.aspx
も---ものを利用する事ができツールなどのVisioくVisioはこんな)リバースエンジニアリングしたり、授業へのUMLを使用してUMLをDBのスキーマ...も使用ツールこのような http://www.tangiblearchitect.net/visual-studio/
知っていれば全体の永続化層が設定によりどちらのモのhbm2ddlタスクでこのほとんどしています。
があり NAntタスク ご利用の通話できます。
亜音速ダイアゴナル でも他のオプションです。私はよく利用することで主体の授業を地図データベース化します。このコマンドラインできるユーティリティで指定したテーブルの種類、およびホストのその他の便利なもの
みDaoliteMappingToolます。います。することができまを生成します。ページからダウンロード こちらの
無料のアプリSchematrixを生成するクラスのDB、チェックアウトの場合は逆のもの:) http://www.schematrix.com/products/schemacoder/download.aspx