gpt4 book ai didi

entity-framework - 我可以先使用强类型 POCO 作为与 EF 代码的相关值,而不必每次都创建新的吗?

转载 作者:行者123 更新时间:2023-12-04 08:31:27 25 4
gpt4 key购买 nike

我在一个类上有一个状态字段,它有一个 ID 和一个名称。我没有使用枚举来对其建模,而是使用具有一些静态值的类,如下所示:

    public class MailoutStatus : IEntity
{
public static MailoutStatus Draft = new MailoutStatus() { Id = 1, Name = "Draft" };
public static MailoutStatus Scheduled = new MailoutStatus() { Id = 2, Name = "Scheduled" };
public static MailoutStatus Cancelled = new MailoutStatus() { Id = 3, Name = "Cancelled" };
public static MailoutStatus Sent = new MailoutStatus() { Id = 4, Name = "Sent" };

public int Id { get; set; }
public string Name { get; set; }
...
}

现在我想在它描述的对象上设置这个状态值,像这样:

        var repo = new MailoutRepository();
var mailout = repo.Get(1);
mailout.Status = MailoutStatus.Cancelled;
repo.Update(mailout);
repo.CommitChanges();

但是,此代码会将 MailoutStatus.Cancelled 视为一个新实体,并将在 MailoutStatus 表中插入一个新行,忽略已处于 Canceled 状态的 ID 并添加一个新的 IDENTITY 生成的 ID(例如,5)。我可以通过添加 entityvalidation 东西来防止这种情况,但这只会由于验证失败而使上述内容爆炸。

我可以使用这段代码解决这个问题:

    var repo = new MailoutRepository();
var mailout = repo.Get(1);
mailout.Status = new MailoutStatusRepository().Get(MailoutStatus.Cancelled.Id);
repo.Update(mailout);
repo.CommitChanges();

这是可行的,因为现在 Entity Framework 知道我正在获取的 MailoutStatus 并正在跟踪它的状态等。但是为了设置状态而必须编写那么多代码真的很糟糕。出于其他原因,我也不想使用枚举,并且我不想让 MailoutStatus 知道任何关于持久性的信息。有什么想法吗?

最佳答案

我是这样解决的。

我定义了一个名为 NotTrackedAttribute 的属性,并将其应用于 Status 等实体。然后重写派生上下文的 SaveChanges 方法,如下所示。重置对那些实体的跟踪更改

    public override int SaveChanges()
{
var changedEntities = ChangeTracker.Entries();

foreach (var changedEntity in changedEntities)
{
var entity = changedEntity.Entity;

//ignore the types that are marked as NotTracked
if (Attribute.IsDefined(entity.GetType(), typeof(NotTrackedAttribute)))
{
changedEntity.State = EntityState.Unchanged;
continue;
}
}

return base.SaveChanges();
}

属性

/// <summary>
/// Indicates that a Type having this attribute should not be persisted.
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class NotTrackedAttribute : Attribute
{
}

然后使用如下

[NotTracked]
public class MailoutStatus
{

}

关于entity-framework - 我可以先使用强类型 POCO 作为与 EF 代码的相关值,而不必每次都创建新的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6847905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com