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