C# 如何在ASP.NETMVC实体框架6项目中创建价值对象?
我的测试应用程序中有几个类:C# 如何在ASP.NETMVC实体框架6项目中创建价值对象?,c#,asp.net-mvc,entity-framework,domain-driven-design,value-objects,C#,Asp.net Mvc,Entity Framework,Domain Driven Design,Value Objects,我的测试应用程序中有几个类: public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { Database.SetInitializer<ApplicationDbContext&
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
Database.SetInitializer<ApplicationDbContext>(new MovieContextInitializer());
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Currency> Currencies { get; set; }
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Types<Movie>()
.Configure(ctc => ctc.Property(m => m.Price.Amount).HasColumnName("MoviePriceAmount"));
modelBuilder.Types<Movie>()
.Configure(ctc => ctc.Property(m => m.Price.Currency.Id).HasColumnName("MoviePriceCurrency"));
base.OnModelCreating(modelBuilder);
}
}
当我试图打电话时:
ApplicationDbContext db = new ApplicationDbContext();
var movies = db.Movies.ToList()
我遇到异常:“在模型生成过程中检测到一个或多个验证错误:DomainDrivenWeb.Models.Currency:名称:架构中的每个类型名称必须是唯一的。类型名称“Currency”已定义。”这里的问题是,您将
Currency
视为ValueObject和实体
这一行:
modelBuilder.Types<Movie>()
.Configure(ctc => ctc.Property(m => m.Price.Currency.Id).HasColumnName("MoviePriceCurrency"));
告诉EF将其视为一个实体
这就是为什么错误消息说模式中的每个类型名都必须是唯一的。类型名称“Currency”已定义。-当需要将货币模型设置为实体时,类型名称Currency已在电影
实体上定义为复杂类型
如果删除这些配置行中的一行或另一行,错误应该会消失,但这并不能真正解决问题,因为您需要考虑,域中的Currency
真的是实体还是ValueObject
电影
的价格
类型为货币
,其属性类型为货币
-此用法意味着它是一个ValueObject。但是该类有一个Id
字段-如果存在“identity”,则表示它是一个实体
您需要仔细考虑这些类型中包含的领域建模和业务流程,以探索如何真正对待它。这里的问题是,您将
货币
视为一个ValueObject和一个实体
这一行:
modelBuilder.Types<Movie>()
.Configure(ctc => ctc.Property(m => m.Price.Currency.Id).HasColumnName("MoviePriceCurrency"));
告诉EF将其视为一个实体
这就是为什么错误消息说模式中的每个类型名都必须是唯一的。类型名称“Currency”已定义。-当需要将货币模型设置为实体时,类型名称Currency已在电影
实体上定义为复杂类型
如果删除这些配置行中的一行或另一行,错误应该会消失,但这并不能真正解决问题,因为您需要考虑,域中的Currency
真的是实体还是ValueObject
电影
的价格
类型为货币
,其属性类型为货币
-此用法意味着它是一个ValueObject。但是该类有一个Id
字段-如果存在“identity”,则表示它是一个实体
您需要仔细考虑这些类型中包含的域建模和业务流程,以探索如何真正处理它。
public Currency{get;private set;}
请尝试在此处使用不同的变量名,例如public Currency{u Currency{get;private set;}
或除Currency
以外的任何内容。答案在错误消息中。我将Currency Currency{get;private set;}更改为Currency AmountCurrency{get;private set;},但得到了相同的异常。公共货币Currency{get;private set;}
请尝试在此处使用其他变量名,例如public Currency{get;private set;}
或除Currency
之外的任何其他内容。答案在错误消息中。我将Currency Currency{get;private set;}更改为Currency AmountCurrency{get;private set;},但得到了相同的异常。
modelBuilder.Types<Movie>()
.Configure(ctc => ctc.Property(m => m.Price.Currency.Id).HasColumnName("MoviePriceCurrency"));
public DbSet<Currency> Currencies { get; set; }