Visual Studio 2012 を使用して、UML クラス図を作成しました。クラス図から、C# クラスを生成しました。
すべてのコードと画像を提示する代わりに、コード ファースト: UML クラス図から MS SQL データベースの作成までの投稿を作成しました。
クラス図からコードを生成すると、リレーションシップがある場合に IEnumerable 型が生成されることに気付きました。
これで問題ありませんが、生成されたコードを Code First の実装に使用したいと考えています。以下では、コンテキストを作成しました。現在、Context クラスには 1 つの関係のみが含まれています。
modelBuilder.Entity<Owner>()
.HasKey(o => o.ownerID)
.HasMany<Client>(o => (ICollection<Client>)o.Clients);
これにより、Owner テーブルと Client テーブルとの 1 対多の関係が作成されます。HasMany は ICollection 型を想定しているため、IEnumerable を ICollection にキャストしました。
私の質問は次のとおりです。UML クラス図からコードを生成するときに、関係を IEnumerable 型ではなく ICollection 型として生成する方法はありますか。私の UML クラス図は私のブログに掲載されています。上記のリンクを提供したブログのリンク。
最終的には、プロジェクトのクラス ダイアグラムを作成し、コードを生成し、コンテキストを作成し (DB テーブルを作成します)、エンティティを利用して開発したいと考えています。
クラス ダイアグラムはリレーションシップを IEnumerable として生成するため、以下では、ICollection にキャストするとコンテキストが機能します。これにより、1 対多の関係が作成されます。クラス図で関係を作成するだけで、コードを生成した後の関係について心配する必要はありません。
public class Context : DbContext
{
public DbSet<Client> Clients { get; set; }
public DbSet<Medication> Medications { get; set; }
public DbSet<MedicalHistory> MedicalHistories { get; set; }
public DbSet<FeedingSchedule> FeedingSchedules { get; set; }
public DbSet<Vaccine> Vaccines { get; set; }
public DbSet<Owner> Owners { get; set; }
public DbSet<Walk> Walks { get; set; }
public DbSet<WhoWalk> WhoWalks { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Owner>().Property(b => b.fname).IsRequired().HasMaxLength(150);
modelBuilder.Entity<Owner>().Property(b => b.lname).IsRequired().HasMaxLength(150);
modelBuilder.Entity<Owner>().HasKey(o => o.ownerID).HasMany<Client>(o => (ICollection<Client>)o.Clients);
base.OnModelCreating(modelBuilder);
}
}
すべてのコードは私のブログで見ることができます: Code-First: From UML Class Diagram to Making MS SQL Database
UML クラス図で生成された C# コードのサンプルを以下に示します。現在、2 つのクラスが作成されており、1 対多の関係があります。
public class Client
{
public virtual int clientID
{
get;
set;
}
public virtual int ownerID
{
get;
set;
}
}
public class Owner
{
public virtual int ownerID
{
get;
set;
}
/// <summary>
/// The pets and owners
/// </summary>
public virtual IEnumerable<Client> Clients
{
get;
set;
}
}
クラス図に以下のコードを生成してもらいたい:
public class Owner
{
public virtual int ownerID
{
get;
set;
}
/// <summary>
/// The pets and owners
/// </summary>
public virtual ICollection<Client> Clients
{
get;
set;
}
}