Как исправить циклическую зависимость в EF Core 8C#

Место общения программистов C#
Ответить
Anonymous
 Как исправить циклическую зависимость в EF Core 8

Сообщение Anonymous »

У меня есть файловая подставка и catalogruleapp , получение из Ruleapp Class, FileSystemruleapp не указан в том, что он не соответствует здесь, но только каталоглеапп должен сохраняться в бату. Также я использую временные таблицы для хранения истории RuleApp для поддержания версии.

Код: Выделить всё

[Serializable]
[DataContract]
public abstract class DefinitionBase : BusinessEntity
{
[DataMember]
public string Name { get; set; }

[DataMember]
public List Categories { get; set; }

//[DataMember]
//public virtual DefinitionBase Parent { get; set; }
}

public interface IRevisionState
{
public List Categories { get; set; }
public List Entities { get; set; }
public List EndPoints { get; set; }
public List DataElements { get; set; }
}

[Serializable]
[DataContract]
public abstract class RuleApp : DefinitionBase, IRevisionState
{
[DataMember]
public List Entities { get; set; }
public List EndPoints { get; set; }
public List DataElements { get; set; }
}

[Serializable]
[DataContract]
public sealed class CatalogRuleApp : RuleApp, IIdentifiableEntity
{
public byte[] Version { get; set; }

[DataMember]
public int Revision { get; set; } = 1;

[IgnoreDataMember]
public string RevisionState
{
get
{
var serializer = (DataContractSerializer)AppWide.Container.Resolve();
var xml = serializer.SerializeToXml(this);
return xml;
}
set
{
if (string.IsNullOrEmpty(value))
return;

var serializer = (DataContractSerializer)AppWide.Container.Resolve();
var revision = serializer.DeserializeFromXml(value);

if (revision != null)
{
Categories = revision.Categories;
Entities = revision.Entities;
EndPoints = revision.EndPoints;
DataElements = revision.DataElements;
}
}
}

[DataMember]
public CheckIn CheckedIn { get; set; }

[DataMember]
public CheckOut CheckedOut { get; set; }
}

[Serializable]
[DataContract]
public class CheckIn : BusinessEntity, IIdentifiableEntity
{
#region Navigation
public CatalogRuleApp? RuleApp { get; set; }
public Guid RuleAppId { get; set; }
#endregion

[DataMember]
public User User { get; set; }
public Guid UserId { get; set; }

[DataMember]
public DateTime DateTime { get; set; }

[DataMember]
public string? Comments { get; set; }

#region IIdentifiableEntity members
public Guid EntityId
{
get => Id;
set => Id = value;
}
#endregion
}
Вот конфигурации EF Core, где класс проверки имеет то же определение, что и проверка :

Код: Выделить всё

class RuleAppEntityTypeConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.HasNoDiscriminator();

builder
.Ignore(x => x.Categories)
.Ignore(x => x.DataElements)
.Ignore(x => x.EndPoints)
.Ignore(x => x.Entities); // Error Throws here

builder.ToTable(nameof(RuleApp), b => b.IsTemporal());
}
}

class CatalogRuleAppEntityTypeConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable(nameof(RuleApp))
.Ignore(x => x.EntityId)
.HasNoDiscriminator();

builder.Property(e => e.RevisionState).HasColumnName("State");

builder.Property(p => p.Version).IsRowVersion();
}
}

class CheckInEntityTypeConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable($"{nameof(CheckIn)}s", b => b.IsTemporal())
.Ignore(x => x.EntityId);
}
}

class CheckOutEntityTypeConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder  builder)
{
builder.ToTable($"{nameof(CheckOut)}s", b => b.IsTemporal())
.Ignore(x => x.EntityId);
}
}
Запускается проблема, при добавлении родительского свойства в определение Base :

Код: Выделить всё

[DataMember]
public virtual DefinitionBase Parent { get; set; }
< /code>
Я получаю эту ошибку: < /p>

Категории свойства 'нельзя игнорировать на типе' ruleapp ', потому что оно объявлено на базовом типе «определение определения». Чтобы исключить это свойство из вашей модели, используйте атрибут [notmapped] или «игнорировать» на базовом типе в «OnModelCreating».
Source=microsoft.entityFrameWorkCore

Цель добавления родителя 
в базовый класс - это способность для определения какого -либо родителя. /> Хотя я не хочу сохранять определение Base явно в базе данных, как смягчить эту проблему?>

Подробнее здесь: https://stackoverflow.com/questions/788 ... -ef-core-8
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»