實體框架通用實體繼承id錯誤

c# entity-framework entity-framework-core inheritance

第2部分問題,從這裡繼續: EntityFramework核心 - 更新記錄失敗,出現DbUpdateConcurrencyException

錯誤:

派生類型'BinaryFile'不能在屬性'Id'上具有KeyAttribute,因為主鍵只能在根類型上聲明。

我試圖盡可能為我的實體做繼承,所以我盡可能地刪除重複。

我的繼承結構:

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在EntityMinimum類的Version字段上禁用isConcurrencyToken時,我收到此錯誤,如下所示:

    // https://stackoverflow.com/questions/44009020/entity-framework-isrowversion-without-concurrency-check
    builder.Entity<EntityMinimum>().Property(x => x.Version).IsRowVersion().IsConcurrencyToken(false);

這是必需的,因為如果我沒有在Version字段上禁用isConcurrencyToken ,我還有另一個問題:

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:數據庫操作預計會影響1行但實際影響0行。自加載實體以來,數據可能已被修改或刪除。

如果我刪除流暢的api配置,它可以工作,但由於具有[TimeStamp]屬性的Version字段而無法更新。

我在EntityMinimum[TimeStamp] Version字段將Version附加到每個表,因此我可以使用TimeStamp在移動和Web數據之間進行同步。

我是正確地做這個結構,還是應該擺脫[TimeStamp] byte[] Version並只使用字符串Version並將DateTime ticks保存到同步目的?

一般承認的答案

問題是電話

builder.Entity<EntityMinimum>()

EntityMinimum類標記為實體 (EF Core繼承策略的一部分),而據我所知,您只是出於實現目的而使用基類層次結構。

相反,您可以使用EF Core模型元數據服務關閉IsConcurrencyToken以獲取從EntityMinimum派生的任何實體的Version屬性,如下所示:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    if (typeof(EntityMinimum).IsAssignableFrom(entityType.ClrType))
        entityType.FindProperty("Version").IsConcurrencyToken = false;
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow