【问题标题】:From UML Model Generating Code To List<T>从 UML 模型生成代码到 List<T>
【发布时间】:2012-08-30 03:14:24
【问题描述】:

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

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

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

这没关系,但是我想将生成的代码用于 Code First 实现。下面,我创建了上下文。目前,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;
    }
}

我希望类图生成以下代码:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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 参考。

    【讨论】:

      【解决方案2】:

      当然。

      只需将多重性保留为 1 并将您的属性类型更改为字面意义上的ICollection&lt;Client&gt;

      【讨论】:

        猜你喜欢
        • 2019-04-03
        • 1970-01-01
        • 2017-07-08
        • 2011-02-25
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多