Як дадаць сериализуемые атрыбуты ўсіх аб'ектаў, спароджаных Entity Framework 5.0

Я выкарыстоўваю EF 5.0 для генерацыі POCO аб'ектаў і выкарыстоўваць яго ў асобным пласце доступу да дадзеных

Я хачу, каб пазначыць усе аб'екты [Serializable]

Як змяніць шаблон, каб дадаць Serializable атрыбут?

9

6 адказы

Калі вы не хочаце, каб змяніць шаблон, вы можаце таксама зрабіць гэта ў асобным файле кода - з-за выгоды частковымі класаў. Так што, калі тыпы тут Foo , Бар і Баз у My.Namespace прасторы імёнаў, вы можаце стварыць асобны файл у тым жа праекце, з:

using System;
namespace My.Namespace {
    [Serializable] partial class Foo {}
    [Serializable] partial class Bar {}
    [Serializable] partial class Baz {}
}

Тады гэта будзе аб'яднана з генераванай палову, ужываючы [Serializable] атрыбут. Гэта таксама дазволіць Вам дадаць свае ўласныя метады для тыпаў, ці даць цела для любога рэалізацый парцыяльнага метаду, які аб'яўляе шаблон.

Я павінен, аднак, перасцерагчы вас: [Serializable] прапануе вы карыстаецеся BinaryFormatter ; гэта <�ет> не абавязкова з'яўляецца добрым кандыдатам. Было б пажадана, каб паглядзець на кантрактнай аснове сериализаторов. Я быў бы вельмі здзіўлены, калі шаблон EF ня ужо ёсць магчымасць для вываду атрыбутаў для DataContractSerializer (у прыватнасці, [DataContract] / [DataMember] </код >). <�Код> BinaryFormatter можа быць вельмі праблематычна, так як вы версія праграмнага забеспячэння.

12
дададзена
+1 за папярэджанне, дзякуй за альтэрнатыўны падыход. Аднак я лічу, што цяжка напісаць радок кожнага тыпу, а таксама я павінен памятаць, каб дадаць дадатковую радок кожны раз, калі я дадаць новы тып да мадэлі.
дададзена аўтар Imran Rizvi, крыніца
Абедзве кампаніі павінны быць адзначаны часткова.
дададзена аўтар taher chhabrawala, крыніца
@ImranRizvi добра, так як вы будзеце <�я>, відавочна, (кашаль) таксама дадаваць новыя інтэграцыйныя тэсты Серыялізацыя кожны раз, калі вы дадаеце тып, які павінен быць сериализовать, ён будзе вельмі хутка паказаць, калі ёсць праблема. Відавочна, р Вы таксама можаце дадаць тэст, які знаходзіць усё вашыя тыпы супакою/DTO з дапамогай адлюстравання і праверкі для атрыбуту/ IsSerializable сцяг.
дададзена аўтар Marc Gravell, крыніца
@ImranRizvi гэта павінна быць прынята адказваць
дададзена аўтар Toshi, крыніца

калі вы карыстаецеся рамкі сутнасці 5.0 або вышэй Дадаць [Serializable] тэг паміж гэтым кодам:

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>

[Serializable]

<#=codeStringGenerator.EntityClassOpening(entity)#>
11
дададзена
Не працуе для EF 6.0
дададзена аўтар user192344, крыніца
Дзякуем Вам за размяшчэнне гэтага абнаўлення!
дададзена аўтар Eric, крыніца
калі ласка
дададзена аўтар nazim hatipoglu, крыніца
@nazimhatipoglu дзякуй. Я дадаў [DataContract] у гэтай радку, і гэта на самай справе дададзены атрыбут да кожнага класу. Але як выкарыстоўваць System.Runtime.Serialization? А як дадаць [DataMember] для уласцівасцяў ў шаблоне?
дададзена аўтар Dark_Knight, крыніца

Для Entity Framework 6 Дадаць Сериализуемый вышэй гэтых двух частак у Model.tt

[Serializable]
Partial <#=Accessibility.ForType(complex)#>

[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
9
дададзена

Ніжэй прыведзены крокі, каб зрабіць так:

1) Адкрыйце файл ModelName.Entity.tt

2) Знайдзіце наступны радок у гэтым файле

6
дададзена
Не працуе для EF 6.0, любая ідэя
дададзена аўтар user192344, крыніца

Вось тое, што вы робіце для EF 6 (па меншай меры);

У файле model.tt, звярніце ўвагу на гэтыя радкі:



    public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1}partial class {2}{3}",
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))
        );
    }

Зменіце яго на іх:



    public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} " + Environment.NewLine + " {1} {2} partial class {3}{4}", 
            "[Serializable]", 
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
    }

Захавайце яго .TT і файлы класа сутнасцяў атрымаць [Serializable] Навык на іх. Гатова.

3
дададзена

Для EF 6 Паспрабуйце знайсці наступны код у .tt файл:

public string EntityClassOpening(EntityType entity)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} {1}partial class {2}{3}",
        Accessibility.ForType(entity),
        _code.SpaceAfter(_code.AbstractOption(entity)),
        _code.Escape(entity),
        _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))
    );
}

Ён мае радковае запаўняльнік ( "{0} {1} частковы клас {2} {3}") вы можаце змяніць яго, што вы хочаце

0
дададзена
глядзіце, як адказаць на StackOverflow.
дададзена аўтар Insane Skull, крыніца