Есть два способа достичь того, что вы хотите.
Если вы хотите использовать те же типы, что и для вашей модели базы данных для 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();
Почему вы хотите пометить UserInfoBind с помощью DataContract? – Mani
Я хочу использовать этот класс в Wcf. Поэтому я использовал Datacontact. Если я ошибаюсь, plz дайте мне некоторое руководство, потому что я новичок в сети Ado net EF. tx – Hitesh