使用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;
}
}
答案 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>