1 //---------------------------------------------------------------------
2 // <copyright file="ObjectStateEntryDbDataRecord.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
12 using System
.Data
.Common
;
13 using System
.ComponentModel
;
14 using System
.Data
.Metadata
.Edm
;
15 using System
.Diagnostics
;
17 namespace System
.Data
.Objects
20 internal sealed class ObjectStateEntryDbDataRecord
: DbDataRecord
, IExtendedDataRecord
22 private readonly StateManagerTypeMetadata _metadata
;
23 private readonly ObjectStateEntry _cacheEntry
;
24 private readonly object _userObject
;
25 private DataRecordInfo _recordInfo
;
27 internal ObjectStateEntryDbDataRecord(EntityEntry cacheEntry
, StateManagerTypeMetadata metadata
, object userObject
)
29 EntityUtil
.CheckArgumentNull(cacheEntry
, "cacheEntry");
30 EntityUtil
.CheckArgumentNull(userObject
, "userObject");
31 EntityUtil
.CheckArgumentNull(metadata
, "metadata");
32 Debug
.Assert(!cacheEntry
.IsKeyEntry
, "Cannot create an ObjectStateEntryDbDataRecord for a key entry");
33 switch (cacheEntry
.State
)
35 case EntityState
.Unchanged
:
36 case EntityState
.Modified
:
37 case EntityState
.Deleted
:
38 _cacheEntry
= cacheEntry
;
39 _userObject
= userObject
;
43 Debug
.Assert(false, "A DbDataRecord cannot be created for an entity object that is in an added or detached state.");
47 internal ObjectStateEntryDbDataRecord(RelationshipEntry cacheEntry
)
49 EntityUtil
.CheckArgumentNull(cacheEntry
, "cacheEntry");
50 Debug
.Assert(!cacheEntry
.IsKeyEntry
, "Cannot create an ObjectStateEntryDbDataRecord for a key entry");
51 switch (cacheEntry
.State
)
53 case EntityState
.Unchanged
:
54 case EntityState
.Modified
:
55 case EntityState
.Deleted
:
56 _cacheEntry
= cacheEntry
;
59 Debug
.Assert(false, "A DbDataRecord cannot be created for an entity object that is in an added or detached state.");
63 override public int FieldCount
67 Debug
.Assert(_cacheEntry
!= null, "CacheEntry is required.");
68 return _cacheEntry
.GetFieldCount(_metadata
);
71 override public object this[int ordinal
]
75 return GetValue(ordinal
);
78 override public object this[string name
]
82 return GetValue(GetOrdinal(name
));
85 override public bool GetBoolean(int ordinal
)
87 return (bool)GetValue(ordinal
);
89 override public byte GetByte(int ordinal
)
91 return (byte)GetValue(ordinal
);
93 override public long GetBytes(int ordinal
, long dataIndex
, byte[] buffer
, int bufferIndex
, int length
)
96 tempBuffer
= (byte[])GetValue(ordinal
);
100 return tempBuffer
.Length
;
102 int srcIndex
= (int)dataIndex
;
103 int byteCount
= Math
.Min(tempBuffer
.Length
- srcIndex
, length
);
106 throw EntityUtil
.InvalidSourceBufferIndex(tempBuffer
.Length
, srcIndex
, "dataIndex");
108 else if ((bufferIndex
< 0) || (bufferIndex
> 0 && bufferIndex
>= buffer
.Length
))
110 throw EntityUtil
.InvalidDestinationBufferIndex(buffer
.Length
, bufferIndex
, "bufferIndex");
115 Array
.Copy(tempBuffer
, dataIndex
, buffer
, bufferIndex
, byteCount
);
119 throw EntityUtil
.InvalidDataLength(length
);
127 override public char GetChar(int ordinal
)
129 return (char)GetValue(ordinal
);
131 override public long GetChars(int ordinal
, long dataIndex
, char[] buffer
, int bufferIndex
, int length
)
134 tempBuffer
= (char[])GetValue(ordinal
);
138 return tempBuffer
.Length
;
141 int srcIndex
= (int)dataIndex
;
142 int charCount
= Math
.Min(tempBuffer
.Length
- srcIndex
, length
);
145 throw EntityUtil
.InvalidSourceBufferIndex(buffer
.Length
, bufferIndex
, "bufferIndex");
147 else if ((bufferIndex
< 0) || (bufferIndex
> 0 && bufferIndex
>= buffer
.Length
))
149 throw EntityUtil
.InvalidDestinationBufferIndex(buffer
.Length
, bufferIndex
, "bufferIndex");
154 Array
.Copy(tempBuffer
, dataIndex
, buffer
, bufferIndex
, charCount
);
158 throw EntityUtil
.InvalidDataLength(length
);
166 override protected DbDataReader
GetDbDataReader(int ordinal
)
168 throw EntityUtil
.NotSupported();
170 override public string GetDataTypeName(int ordinal
)
172 return (GetFieldType(ordinal
)).Name
;
174 override public DateTime
GetDateTime(int ordinal
)
176 return (DateTime
)GetValue(ordinal
);
178 override public Decimal
GetDecimal(int ordinal
)
180 return (Decimal
)GetValue(ordinal
);
182 override public double GetDouble(int ordinal
)
184 return (Double
)GetValue(ordinal
);
186 public override Type
GetFieldType(int ordinal
)
188 return _cacheEntry
.GetFieldType(ordinal
, _metadata
);
190 override public float GetFloat(int ordinal
)
192 return (float)GetValue(ordinal
);
194 override public Guid
GetGuid(int ordinal
)
196 return (Guid
)GetValue(ordinal
);
198 override public Int16
GetInt16(int ordinal
)
200 return (Int16
)GetValue(ordinal
);
202 override public Int32
GetInt32(int ordinal
)
204 return (Int32
)GetValue(ordinal
);
206 override public Int64
GetInt64(int ordinal
)
208 return (Int64
)GetValue(ordinal
);
210 override public string GetName(int ordinal
)
212 return _cacheEntry
.GetCLayerName(ordinal
, _metadata
);
214 override public int GetOrdinal(string name
)
216 int ordinal
= _cacheEntry
.GetOrdinalforCLayerName(name
, _metadata
);
219 throw EntityUtil
.ArgumentOutOfRange("name");
223 override public string GetString(int ordinal
)
225 return (string)GetValue(ordinal
);
227 override public object GetValue(int ordinal
)
229 if (_cacheEntry
.IsRelationship
)
231 return (_cacheEntry
as RelationshipEntry
).GetOriginalRelationValue(ordinal
);
235 return (_cacheEntry
as EntityEntry
).GetOriginalEntityValue(_metadata
, ordinal
, _userObject
, ObjectStateValueRecord
.OriginalReadonly
);
238 override public int GetValues(object[] values
)
242 throw EntityUtil
.ArgumentNull("values");
244 int minValue
= Math
.Min(values
.Length
, FieldCount
);
245 for (int i
= 0; i
< minValue
; i
++)
247 values
[i
] = GetValue(i
);
251 override public bool IsDBNull(int ordinal
)
253 return (GetValue(ordinal
) == DBNull
.Value
);
256 public DataRecordInfo DataRecordInfo
260 if (null == _recordInfo
)
262 Debug
.Assert(_cacheEntry
!= null, "CacheEntry is required.");
263 _recordInfo
= _cacheEntry
.GetDataRecordInfo(_metadata
, _userObject
);
268 public DbDataRecord
GetDataRecord(int ordinal
)
270 return (DbDataRecord
)GetValue(ordinal
);
272 public DbDataReader
GetDataReader(int i
)
274 return this.GetDbDataReader(i
);