第2部分问题,从这里继续: EntityFramework Core - Update record fails with DbUpdateConcurrencyException
错误:
派生类型' BinaryFile'不能在属性上使用KeyAttribute' Id'因为主键只能在根类型上声明。
我正在尽可能地为我的实体做继承,所以我尽可能地删除了重复。
我的继承结构:
public interface IEntityMinimum
{
bool IsDeleted { get; set; }
byte[] Version { get; set; }
string CreatedBy { get; set; }
}
public class EntityMinimum : IEntityMinimum
{
public bool IsDeleted { get; set; }
[Timestamp]
public byte[] Version { get; set; }
public string CreatedBy { get; set; }
}
public interface IEntity : IEntityMinimum
{
object Id { get; set; }
DateTime CreatedDate { get; set; }
DateTime? ModifiedDate { get; set; }
string ModifiedBy { get; set; }
}
public interface IEntity<T> : IEntity
{
new T Id { get; set; }
}
public abstract class Entity<T> : EntityMinimum, IEntity<T>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public T Id { get; set; }
object IEntity.Id
{
get => Id;
set => throw new NotImplementedException();
}
private DateTime? _createdDate;
[DataType(DataType.DateTime)]
public DateTime CreatedDate
{
get => _createdDate ?? DateTime.UtcNow;
set => _createdDate = value;
}
[DataType(DataType.DateTime)]
public DateTime? ModifiedDate { get; set; }
public string ModifiedBy { get; set; }
}
public class EntityMaximum : Entity<int>
{
public bool IsActive { get; set; }
}
public class BinaryFile : EntityMaximum
{
public string Name { get; set; }
public string UniqueName { get; set; }
public Guid UniqueId { get; set; }
public byte[] Content { get; set; }
public virtual ICollection<Campaign> Campaigns { get; set; }
}
当我使用Fluent API在isConcurrencyToken
类的Version
字段上禁用EntityMinimum
时出现此错误,如下所示:
// https://stackoverflow.com/questions/44009020/entity-framework-isrowversion-without-concurrency-check
builder.Entity<EntityMinimum>().Property(x => x.Version).IsRowVersion().IsConcurrencyToken(false);
这是必需的,因为如果我未在isConcurrencyToken
字段上停用Version
,我还有其他问题:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库操作预计会影响1行,但实际上会影响0行。自实体加载以来,数据可能已被修改或删除。
如果删除流畅的api配置,它可以正常运行,但由于具有Version
属性的[TimeStamp]
字段而无法更新。
我在[TimeStamp]
中有Version
EntityMinimum
字段,可以将Version
附加到每个表格,因此我可以使用TimeStamp
在移动设备和网络之间进行同步数据
我是否正确地执行了此结构,或者我应该删除[TimeStamp] byte[] Version
并使用字符串Version
并将DateTime
刻度保存到其中以进行同步?
答案 0 :(得分:3)
问题在于呼叫
builder.Entity<EntityMinimum>()
将EntityMinimum
类标记为实体(EF Core继承策略的一部分),而据我所知,您只是出于实现目的使用基类层次结构。
相反,您可以使用EF Core模型元数据服务为IsConcurrencyToken
派生的任何真实实体的Version
属性关闭EntityMinimum
,如下所示:
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
if (typeof(EntityMinimum).IsAssignableFrom(entityType.ClrType))
entityType.FindProperty("Version").IsConcurrencyToken = false;
}