1 //---------------------------------------------------------------------
2 // <copyright file="EntityContainerEntitySet.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
10 namespace System.Data.EntityModel.SchemaObjectModel
12 using System.Data.Entity;
13 using System.Data.Metadata.Edm;
14 using System.Diagnostics;
18 /// Represents an EntitySet element.
20 internal sealed class EntityContainerEntitySet : SchemaElement
22 private SchemaEntityType _entityType = null;
23 private string _unresolvedEntityTypeName = null;
24 private string _schema = null;
25 private string _table = null;
26 private EntityContainerEntitySetDefiningQuery _definingQueryElement = null;
30 /// Constructs an EntityContainerEntitySet
32 /// <param name="parentElement">Reference to the schema element.</param>
33 public EntityContainerEntitySet( EntityContainer parentElement )
34 : base( parentElement )
38 public override string FQName
42 return this.ParentElement.Name + "." + this.Name;
46 public SchemaEntityType EntityType
54 public string DbSchema
70 public string DefiningQuery
74 if (_definingQueryElement != null)
76 return _definingQueryElement.Query;
82 protected override bool HandleElement(XmlReader reader)
84 if (base.HandleElement(reader))
88 else if (Schema.DataModel == SchemaDataModelOption.ProviderDataModel)
90 if (CanHandleElement(reader, XmlConstants.DefiningQuery))
92 HandleDefiningQueryElement(reader);
96 else if (Schema.DataModel == SchemaDataModelOption.EntityDataModel)
98 if (CanHandleElement(reader, XmlConstants.ValueAnnotation))
100 // EF does not support this EDM 3.0 element, so ignore it.
104 else if (CanHandleElement(reader, XmlConstants.TypeAnnotation))
106 // EF does not support this EDM 3.0 element, so ignore it.
114 protected override bool HandleAttribute(XmlReader reader)
116 if (base.HandleAttribute(reader))
120 else if (CanHandleAttribute(reader, XmlConstants.EntityType))
122 HandleEntityTypeAttribute(reader);
125 if (Schema.DataModel == SchemaDataModelOption.ProviderDataModel)
127 if (CanHandleAttribute(reader, XmlConstants.Schema))
129 HandleDbSchemaAttribute(reader);
132 else if (CanHandleAttribute(reader, XmlConstants.Table))
134 HandleTableAttribute(reader);
141 private void HandleDefiningQueryElement(XmlReader reader)
143 Debug.Assert(reader != null);
145 EntityContainerEntitySetDefiningQuery query = new EntityContainerEntitySetDefiningQuery(this);
147 _definingQueryElement = query;
150 protected override void HandleNameAttribute(XmlReader reader)
152 if (Schema.DataModel == SchemaDataModelOption.ProviderDataModel)
154 // ssdl will take anything, because this is the table name, and we
155 // can't predict what the vendor will need in a table name
160 base.HandleNameAttribute(reader);
164 /// The method that is called when a Type attribute is encountered.
166 /// <param name="reader">An XmlReader positioned at the Type attribute.</param>
167 private void HandleEntityTypeAttribute( XmlReader reader )
169 Debug.Assert( reader != null );
171 ReturnValue<string> value = HandleDottedNameAttribute( reader, _unresolvedEntityTypeName, Strings.PropertyTypeAlreadyDefined );
172 if ( value.Succeeded )
174 _unresolvedEntityTypeName = value.Value;
179 /// The method that is called when a DbSchema attribute is encountered.
181 /// <param name="reader">An XmlReader positioned at the Type attribute.</param>
182 private void HandleDbSchemaAttribute( XmlReader reader )
184 Debug.Assert(Schema.DataModel == SchemaDataModelOption.ProviderDataModel, "We shouldn't see this attribute unless we are parsing ssdl");
185 Debug.Assert( reader != null );
187 _schema = reader.Value;
191 /// The method that is called when a DbTable attribute is encountered.
193 /// <param name="reader">An XmlReader positioned at the Type attribute.</param>
194 private void HandleTableAttribute( XmlReader reader )
196 Debug.Assert(Schema.DataModel == SchemaDataModelOption.ProviderDataModel, "We shouldn't see this attribute unless we are parsing ssdl");
197 Debug.Assert( reader != null );
199 _table = reader.Value;
204 /// Used during the resolve phase to resolve the type name to the object that represents that type
206 internal override void ResolveTopLevelNames()
208 base.ResolveTopLevelNames();
210 if ( _entityType == null )
212 SchemaType type = null;
213 if ( ! Schema.ResolveTypeName( this, _unresolvedEntityTypeName, out type) )
218 _entityType = type as SchemaEntityType;
219 if ( _entityType == null )
221 AddError( ErrorCode.InvalidPropertyType, EdmSchemaErrorSeverity.Error,
222 System.Data.Entity.Strings.InvalidEntitySetType(_unresolvedEntityTypeName ) );
228 internal override void Validate()
232 if (_entityType.KeyProperties.Count == 0)
234 AddError(ErrorCode.EntitySetTypeHasNoKeys, EdmSchemaErrorSeverity.Error,
235 System.Data.Entity.Strings.EntitySetTypeHasNoKeys(Name, _entityType.FQName));
238 if (_definingQueryElement != null)
240 _definingQueryElement.Validate();
242 if (DbSchema != null || Table != null)
244 AddError(ErrorCode.TableAndSchemaAreMutuallyExclusiveWithDefiningQuery, EdmSchemaErrorSeverity.Error,
245 System.Data.Entity.Strings.TableAndSchemaAreMutuallyExclusiveWithDefiningQuery(FQName));
250 internal override SchemaElement Clone(SchemaElement parentElement)
252 EntityContainerEntitySet entitySet = new EntityContainerEntitySet((EntityContainer)parentElement);
253 entitySet._definingQueryElement = this._definingQueryElement;
254 entitySet._entityType = this._entityType;
255 entitySet._schema = this._schema;
256 entitySet._table = this._table;
257 entitySet.Name = this.Name;