У сущности, имеющей дочерние коллекции, вызывающие проблемы в WCF: рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer - PullRequest
0 голосов
/ 18 января 2019

Изо всех сил пытались исправить это в течение дня. Впервые в EF !!

Мне требуется собрать список продуктов вместе с дочерними коллекциями.

Мой Model.tt находится в DataModel.dll, и я ссылаюсь на это как в службе WCF, так и в моем клиенте. Когда у сущности есть дочерняя коллекция, я получаю эту ошибку. Думаю, это связано с публичной виртуальной коллекцией объекта. Как я могу это исправить?

Попытка вставить [KnownType (typeof (entity.Name))] в мой Model.tt поможет? Если да, то как получить сущность. Имя, передаваемое в моем Model.tt?

TRIED:

  1. Поместите атрибут [Serializable] в мой Model.tt
  2. LazyLoadingEnabled = "ложь"

ОШИБКА ЗАПИСАНА В ЖУРНАЛЕ TRACE:

Тип 'System.Data.Entity.DynamicProxies.Entity_Product_F540EDA252AD69FEA102E0C9AB0167D5397996ADA4679FA9C4089B58B9766924' с именем контракта данных «Entity_Product_F540EDA252AD69FEA102E0C9AB0167D5397996ADA4679FA9C4089B58B9766924: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' не ожидается. Рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer или добавляете любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавляя их в список известных типов, передаваемых сериализатору.

Был ошибка при попытке сериализовать параметр http://tempuri.org/:GetAllProductResult. Сообщение InnerException был «Type„System.Data.Entity.DynamicProxies.Entity_Product_F540EDA252AD69FEA102E0C9AB0167D5397996ADA4679FA9C4089B58B9766924“с именем контракта данных» Entity_Product_F540EDA252AD69FEA102E0C9AB0167D5397996ADA4679FA9C4089B58B9766924: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' не является ожидается. Рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer или добавляете любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавляя их в список известных типов, передаваемых в сериализатор. '. Пожалуйста, смотрите InnerException для более подробной информации.

АВТО-ГЕНЕРАЦИЯ:

   [Serializable] 
public partial class Entity_Product
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Entity_Product()
    {
        this.tbl_ManufacturerDetail = new HashSet<Entity_ManufacturerDetail>();
        this.tbl_ProductDetails = new HashSet<Entity_ProductDetails>();
    }

    public int ProductId { get; set; } 
    public string Administration { get; set; }
    public string Manufacturer { get; set; }
    public Nullable<decimal> Price { get; set; } 
    public Nullable<bool> IsEnabled { get; set; }
    public Nullable<System.DateTime> CreatedOn { get; set; }
    public string CreatedBy { get; set; }
    public Nullable<System.DateTime> UpdatedOn { get; set; }
    public string UpdatedBy { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Entity_ManufacturerDetail> tbl_ManufacturerDetail { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Entity_ProductDetails> tbl_ProductDetails { get; set; }
}

1 Ответ

0 голосов
/ 18 января 2019

Я не уверен, что это решение вашей проблемы, но это позволит вам добавить [KnownType(typeof(entity.Name))] в ваш Model.tt. Не только имя объекта, но и имена объектов каждого свойства навигации коллекции.

Это строка 1-70 моего измененного Model.tt файла. Я только изменил строки между комментариями //START MODIFICATION и //END MODIFICATION.

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
 output extension=".cs"#><#

const string inputFile = @"Model.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);

if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
{
    return string.Empty;
}

WriteHeader(codeStringGenerator, fileManager);

foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
    fileManager.StartNewFile(entity.Name + ".cs");
    BeginNamespace(code);
#>
//START MODIFICATION
using System.Runtime.Serialization;
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#
    var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
    var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
    var complexProperties = typeMapper.GetComplexProperties(entity);

    foreach (var navigationProperty in collectionNavigationProperties)
    {
#>
[KnownType(typeof(<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>))]
<#
    }
#>
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
<#
    if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
    {
#>
    public <#=code.Escape(entity)#>()
    {
//END MODIFICATION
<#
        foreach (var edmProperty in propertiesWithDefaultValues)
        {
#>
        this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>;
<#
        }

        foreach (var navigationProperty in collectionNavigationProperties)
        {
#>
        this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();
<#
        }

        foreach (var complexProperty in complexProperties)
        {
#>
        this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
<#
        }
#>
    }
...