2015-03-18 4 views
-1

Я новичок в сети Ado. Я использую EF 6.Как добавить объект таблицы как сериализуемый в Ado net в EF 6

У меня есть 2 таблицы UserInfo и UserType.

Теперь, когда я хочу получить userInfo, я хочу установить UserTypeName для отображения в сетке с другим UserInfo, и для этого я использовал ниже код.

public List<UserInfoBind> SearchBindUser(UserInfo objSeacrh) 
     { 
      try 
      {      
       List<UserInfoBind> objList = (from sql in dbContext.UserInfoes.Where(t => t.IsDelete != true) 
               join tblType in dbContext.UserTypes 
               on sql.UserType equals tblType.UserTypeID 
               select new UserInfoBind() 
               { 
                UserTypeName = tblType.UserTypeName 
               }).ToList(); 
       return objList; 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

И Decalre UserInforBind, как показано ниже:

[DataContract] 
    public class UserInfoBind : UserInfo 
    { 
     public UserInfoBind() 
     { 

     } 

     [DataMember] 
     public string UserTypeName { get; set; } 
    }  

Но это дает ошибку: "Тип 'DAL.UserInfoBind' не может наследовать от типа, не обозначенному DataContractAttribute или SerializableAttribute."

Итак, как я могу сделать SerializableAttribute из USERINFO таблицы объекта в EF 6. Спасибо, Hitesh Paghadal

+0

Почему вы хотите пометить UserInfoBind с помощью DataContract? – Mani

+0

Я хочу использовать этот класс в Wcf. Поэтому я использовал Datacontact. Если я ошибаюсь, plz дайте мне некоторое руководство, потому что я новичок в сети Ado net EF. tx – Hitesh

ответ

1

Есть два способа достичь того, что вы хотите.

Если вы хотите использовать те же типы, что и для вашей модели базы данных для WCF DataContract, то вам необходимо пометить свою сущность атрибутом и свойствами DataContract с атрибутом DataMember. Я предполагаю, что вы используете подход Database First, если да, вы можете изменить шаблон генерации кода, чтобы пометить все ваши объекты атрибутом DataContract и всеми свойствами с атрибутом DataMember.

Другой подход заключается в том, чтобы оставить ваши типы баз данных как есть и создать новый набор типов для ваших DataContract (s) и использовать такие инструменты, как AutoMapper, для сопоставления свойств, которые вам нужны.

Я предпочитаю второй подход, так как он позволяет вам изменить базовую модель, не влияя на то, что отображается через службу WCF.

Edit: Если вы тусклый пойти с шаблоном редактирования кода, то, вот как вы это делаете

Под файл EDMX, вы увидите два файла с расширением .TT. Один для контекста данных и один для модели. Откройте один создать для модели и сделать изменения в следующем

// To add DataMember attibute in all the properties 
// Change 


public string Property(EdmProperty edmProperty) 
    { 
     return string.Format(
      CultureInfo.InvariantCulture, 
      "{0} {1} {2} {{ {3}get; {4}set; }}", 
      Accessibility.ForProperty(edmProperty), 
      _typeMapper.GetTypeName(edmProperty.TypeUsage), 
      _code.Escape(edmProperty), 
      _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), 
      _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); 
    } 

// To 

public string Property(EdmProperty edmProperty) 
{ 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "[DataMember] {0} {1} {2} {{ {3}get; {4}set; }}", 
     Accessibility.ForProperty(edmProperty), 
     _typeMapper.GetTypeName(edmProperty.TypeUsage), 
     _code.Escape(edmProperty), 
     _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), 
     _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); 
} 

// To add DataMember attibute in all the navigation properties 
// Change 

public string NavigationProperty(NavigationProperty navProp) 
{ 
    var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()); 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{0} {1} {2} {{ {3}get; {4}set; }}", 
     AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)), 
     navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, 
     _code.Escape(navProp), 
     _code.SpaceAfter(Accessibility.ForGetter(navProp)), 
     _code.SpaceAfter(Accessibility.ForSetter(navProp))); 
} 

// TO 

public string NavigationProperty(NavigationProperty navProp) 
{ 
    var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()); 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "[DataMember] {0} {1} {2} {{ {3}get; {4}set; }}", 
     AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)), 
     navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, 
     _code.Escape(navProp), 
     _code.SpaceAfter(Accessibility.ForGetter(navProp)), 
     _code.SpaceAfter(Accessibility.ForSetter(navProp))); 
} 

// To add DataContract attibute in all the types 
// Change 

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))); 
} 

// To 


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


// To include System.Runtime.Serialization 
// Change 



public string UsingDirectives(bool inHeader, bool includeCollections = true) 
    { 
     return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion()) 
      ? string.Format(
       CultureInfo.InvariantCulture, 
       "{0}using System;{1}" + 
       "{2}", 
       inHeader ? Environment.NewLine : "", 
       includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "", 
       inHeader ? "" : Environment.NewLine) 
      : ""; 
    } 



    // To 



public string UsingDirectives(bool inHeader, bool includeCollections = true) 
{ 
    return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion()) 
     ? string.Format(
      CultureInfo.InvariantCulture, 
      "{0}using System;{1}" + 
      "using System.Runtime.Serialization;{2}" + 
      "{3}", 
      inHeader ? Environment.NewLine : "", 
      Environment.NewLine, 
      includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "", 
      inHeader ? "" : Environment.NewLine) 
     : ""; 
} 

Edit 2: Изменить выберите способ включить все свойства из UserInfo иначе ваш UserInfoBind будет только UserTypeName

select new UserInfoBind() 
{ 
    userInfoprop1 = sql.value1, 
    userInfoprop2 = sql.value2, 
    UserTypeName = tblType.UserTypeName 
}).ToList(); 
+0

Привет Спасибо за ответ. Я использую первый подход к базе данных. Но как я могу пометить все объекты DataContract? – Hitesh

+0

Спасибо, ошибка решена, но когда я получаю данные, все данные равны нулю. Для примера у меня есть 3 пользовательских данных, и когда я получаю данные, используя вышеприведенную функцию, он отображает 3 счета, но Data - null. Могу ли я сделать какие-либо изменения в запросе Linq и UserInfoBind, которые я сделал для использования в моем проекте, потому что в настоящее время я объявляю DataInfoBind calss Datacontact. – Hitesh

+0

В вашем запросе linq выбирается имя пользователя, поэтому у вас есть null для всех свойств, унаследованных от UserInfo. Измените свой выбор, чтобы установить все необходимые свойства. – Mani