问题
My Entity Framework model is generated from SQL Server database. Since I need to access database from Silverlight, I generated a DomainService for RIAServices against the EF model. Product
is one of the autogenerated EntityObject
corresponding to the table Product
. I am attempting to pass the custom class CompositeData
across to the Silverlight client as shown. The problem is that CurrentProduct
field is not accessible in the client but the other string/int fields are accessible. How can make CurrentProduct
accessible from client?
public class CompositeData
{
[Key]
public Guid PKey { get; set; }
public string CompositeName { get; set; }
public string Identity { get; set; }
public Product CurrentProduct { get; set; } //Product is an auto-generated EntityObject class
public CompositeData()
{
PKey = Guid.NewGuid();
}
}
Following is the Domain Service method:
[EnableClientAccess()]
public class LocalDomainService : DomainService
{
public IEnumerable<CompositeData> GetData()
{
List<CompositeData> listData = new List<CompositeData>();
//...
return listData;
}
}
From the Silverlight client,
domService.Load(domService.GetDataQuery(), GetDataCompleted, null);
private void GetDataCompleted(LoadOperation<CompositeData> compData)
{
foreach(CompositeData cdItem in compData.Entities)
{
// cdItem.CompositeName is accessible
// cdItem.CurrentProduct is not accessible!
}
}
EDIT:
Product
class is autogenerated in Model1.Designer.cs
[EdmEntityTypeAttribute(NamespaceName="MyDBModel", Name="Product")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Product : EntityObject
{
//..
}
It gets generated in the client project also (in SilverlightProject.g.cs)
/// <summary>
/// The 'Product' entity class.
/// </summary>
[DataContract(Namespace="http://schemas.datacontract.org/2004/07/SilverlightProject")]
public sealed partial class Product : Entity
{
//..
}
回答1:
You can define a relation between CompositeData
and Product
using Include
and Association
attributes.
[System.ServiceModel.DomainServices.Server.Include]
[System.ComponentModel.DataAnnotations.Association("AssociationName", "MainKey", "AssociatedObjectKey")]
public Product CurrentProduct { get; set; }
回答2:
(sorry for my bad english)
You need to expose your Product
entity in the DomainService class too to be able to see it on the silverlight side:
public IEnumerable<Product> GetProduct()
{
//...
return listProduct;
}
回答3:
Here is what i do to quickly add tables to my RIA Silverlight project. this assumes i already have an existing ADO.NET Entity Data Model, DomainService.cs, and DomainService.metadata.cs
- i update my data model
- build project
- add a brand new Domain Service class and name is something different than the one you have.
- add only the new table to your new Domain Service when it asks. this should generate both a new domainservice.cs and a domainservice.metadata.cs with the info for your new table.
- copy out the auto generated code from the new domain service and place it in your existing domain service and delete the one you just created.
- do the same thing for the metadata.
- build the project and then your done.
回答4:
It is possible by defining ExternalReferenceAttribute and AssociationAttribute attribute over your CurrentProduct property.
[System.ServiceModel.DomainServices.ExternalReference]
[System.ComponentModel.DataAnnotations.Association("AssociationName", "MainKey", "AssociatedObjectKey")]
public Product CurrentProduct { get; set; }
Just replace Include attribute with ExternalReference attribute.
来源:https://stackoverflow.com/questions/8960944/cannot-access-entityobject-type-via-ria-services