从UML模型生成代码到列表<t> </t>

时间:2012-08-30 03:14:24

标签: c# asp.net ef-code-first uml

使用Visual Studio 2012,我创建了一个UML类图。从类图中,我生成了C#类。

我没有展示所有代码和图片,而是创建了一个帖子:Code-First: From UML Class Diagram to Creating MS SQL Database

从类图生成代码时,我注意到,当存在关系时,会生成IEnumerable类型。

这没关系,但我想将生成的代码用于Code First实现。下面,我创建了Context。目前,Context类只包含一个关系。

modelBuilder.Entity<Owner>()
.HasKey(o => o.ownerID)
.HasMany<Client>(o => (ICollection<Client>)o.Clients); 

这将与Owner和Client表创建一对多关系。因为HasMany期望ICollection类型,所以我将IEnumerable转换为ICollection。

我的问题是:当我从UML类图生成代码时,有没有办法将关系生成为ICollection类型而不是IEnumerable类型。我的UML类图显示在我的博客上。我上面提供的博客链接链接。

最后,我想只创建项目的类图,生成代码,创建上下文(创建数据库表),并利用实体进行开发。

因为类图生成的关系为IEnumerable,所以当我转换为ICollection时,上下文会起作用。它创造了一对多的关系。我想在类图中创建关系,而不是在生成代码后担心关系。

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 Creating MS SQL Database

我在下面列出了UML类图生成C#代码的示例。目前,创建了两个类,它们具有一对多的关系。

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

我希望Class Diagram在下面生成代码:

public class Owner
{
    public virtual int ownerID
    {
        get;
        set;
    }

    /// <summary>
    /// The pets and owners
    /// </summary>
    public virtual ICollection<Client> Clients
    {
        get;
        set;
    }
}

2 个答案:

答案 0 :(得分:1)

我有同样的问题,另一个stackoverflow帖子帮助了我:

1)像这篇文章更新t4文件:Visual Studio Architecture Code Generation - Create List<type> rather than IEnumerable<type>

2)我复制了这些文件并修改了ICollection,并在VS-&gt; Architecture-&gt;配置默认代码生成设置上更新了我的UML类图上的t4参考。

答案 1 :(得分:0)

不确定。

将多重性保留为1并将属性类型更改为字面ICollection<Client>