基类
public abstract class AbstractAuditBuilder
{
private readonly AbstractAudit builder;
protected AbstractAuditBuilder(AbstractAudit builder)
{
this.builder = builder;
this.builder.CreatedId = 1;
this.builder.CreatedOn = DateTime.Now.AddYears(-1);
}
public AbstractAuditBuilder WithCreatedId(int createdId)
{
builder.CreatedId = createdId;
return this;
}
派生类
public class SaleGroupBuilder : AbstractAuditBuilder
{
private static readonly SaleGroup saleGroup = new SaleGroup();
public SaleGroupBuilder() : base(saleGroup)
{
saleGroup.SaleGroupId = 1;
saleGroup.Description = "Miscellaneous";
}
public SaleGroupBuilder WithSaleGroupId(int saleGroupId)
{
saleGroup.SaleGroupId = saleGroupId;
return this;
}
private SaleGroup Build()
{
return saleGroup;
}
public static implicit operator SaleGroup(SaleGroupBuilder builder)
{
return builder.Build();
}
使用上面的
public class SeedSaleGroup
{
public static void Seed(ContextMaster context)
{
context.SaleGroup.Add(new SaleGroupBuilder().WithSaleGroupId(1));
context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Corporates")
.WithSaleGroupId(2));
context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Insurance")
.WithSaleGroupId(3));
context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Removals")
.WithSaleGroupId(4));
context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Self Storage")
.WithSaleGroupId(5));
context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Storage")
.WithSaleGroupId(6));
}
}
现在,当我使用Entity Framework 6调用context.SaveChanges()时,它只会保存最后一项,因此在数据库中只有一条记录是一个描述为“存储”的销售组。我相信这是因为我的SaleGroupBuilder类正在创建静态只读的SaleGroup,但是如果我删除关键字static,我会收到以下错误: 非静态字段,方法或属性需要对象引用。
我试过这个: 公共类SaleGroupBuilder:AbstractInformationBuilder { 私人readonly SaleGroup saleGroup;
public SaleGroupBuilder(SaleGroup saleGroup) : base(saleGroup)
{
this.saleGroup = saleGroup;
saleGroup.SaleGroupId = 1;
saleGroup.Description = "Miscellaneous";
}
然后我像这样使用它:
public class SeedSaleGroup
{
public static void Seed(ContextMaster context)
{
context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithSaleGroupId(1));
context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Corporates")
.WithSaleGroupId(2));
context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Insurance")
.WithSaleGroupId(3));
context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Removals")
.WithSaleGroupId(4));
context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("SelfStorage")
.WithSaleGroupId(5));
context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Storage")
.WithSaleGroupId(6));
}
}
这个工作,并将所有记录插入数据库,但我不希望每次都传递新的SaleGroup(),有没有其他方法来实现这一点? 这是我的第一篇文章,所以请问我是否没有正确解释。 谢谢。
答案 0 :(得分:0)
嗯,很明显,每次打电话给你的工厂修改了同一个对象:
private static readonly SaleGroup saleGroup = new SaleGroup();
每次启动新工厂时都应该创建新对象:
public class SaleGroupBuilder : AbstractAuditBuilder
{
private readonly SaleGroup saleGroup = new SaleGroup();
public SaleGroupBuilder() : base(saleGroup)
{
saleGroup.SaleGroupId = 1;
saleGroup.Description = "Miscellaneous";
}
//...
不确定base
调用的内容 - 它看起来不应该在您的示例中编译,但这可能是您省略的另一个细节。或者您可能只是使用误导性名称 - builder
而不是objectBeingBuilt
。
答案 1 :(得分:0)
我可以添加,因为这是我们一起工作的项目,这里的目标是创建许多不同的数据构建器,每个对象一个,每个对象在定义时继承自基类,因为大多数例如,对象具有与CreatedId,CreatedOn,ModifiedId,ModifiedOn相同的属性。理想情况下,我们的数据构建器不希望为每个数据构建器重复WithCreatedId,WithCreatedOn,WithModifiedId,WithModifiedOn方法,因为我们不想重复自己,因此决定拥有一个基类。但是,如果我们将对象新增为静态,我们似乎只能使用基类,除非有人能够以不同的方式提供进一步的洞察力。 HTH进一步阐明了这个问题:)