1

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

我没有展示所有代码和图像,而是在以下位置创建了一个帖子:代码优先:从 UML 类图到创建 MS SQL 数据库

从类图生成代码时,我注意到,当存在关系时,会生成一个 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;
    }
}
4

2 回答 2

1

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

1) 像这篇文章一样更新 t4 文件:Visual Studio Architecture Code Generation - Create List<type> 而不是 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 回答