1

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;
    }
}
4

2 に答える 2

1

私は同じ問題を抱えており、別のスタックオーバーフローの投稿が役に立ちました:

1) この投稿のように t4 ファイルを更新します: Visual Studio Architecture Code Generation - Create List<type> rather than IEnumerable<type>

2) ICollection を変更してこれらのファイルをコピーし、VS->Architecture->Configure Default Code Generation Settings の UML クラス図の t4 リファレンスを更新しました。

于 2014-05-30T20:00:48.893 に答える
0

もちろん。

多重度を 1 のままにして、プロパティ タイプを文字通りに変更します。ICollection<Client>

于 2013-03-01T20:22:18.203 に答える