Google Analytics İzleme

09 Ekim 2012

Entity Framework - nvarchar tipindeki alanın boyutu artıldığında oluşan hata

Sql server'da SettingValueTR_TR alanında nvarchar(1024) boyutundan nvarchar(2048) boyutuna yükselttim. Ancak visual studio içinde .edmx dosyasını yenilemedim. İlgili tabloda bir satırı web uygulamasında güncelleme yapınca

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

şeklinde hata verdi.

Entity validation hatalarını detaylı görmek için şu şekilde yakalamak gerekiyormuş:

try
{
  ..
  ..
  dbContext.SaveChanges();
}

catch (DbEntityValidationException dbEx)
{
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }               
}

Baktığımda ise:
validationError.PropertyName = "SettingValueTR_TR"
validationError.ErrorMessage = "The field SettingValueTR_TR must be a string or array type with a maximum length of '1024'."
şeklinde bilgi veriyordu.

Entity framework .SaveChanges() metodunu çalıştırmadan önce .edmx'de bulunan validation kurallarını uyguluyormuş. 1024 bilgisi için de .emdx dosyasını xml olarak açtım ve ilgili boyut tanımını gördüm.


...

<!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>

...
...
<EntityType Name="sepa_FormSetting">
          <Key>
            <PropertyRef Name="SettingGUID" />
          </Key>
          <Property Name="SettingGUID" Type="uniqueidentifier" Nullable="false" />
          <Property Name="TermGUID" Type="uniqueidentifier" />
          <Property Name="SettingCode" Type="nvarchar" Nullable="false" MaxLength="128" />
          <Property Name="SettingDescriptionTR_TR" Type="nvarchar" MaxLength="256" />
          <Property Name="SettingDescriptionEN_US" Type="nvarchar" MaxLength="256" />
          <Property Name="SettingValueTR_TR" Type="nvarchar" MaxLength="1024" />
          <Property Name="SettingValueEN_US" Type="nvarchar" MaxLength="1024" />
</EntityType>
....
...
...

<!-- CSDL content -->
    <edmx:ConceptualModels>
...


<EntityType Name="sepa_FormSetting">
          <Key>
            <PropertyRef Name="SettingGUID" />
          </Key>
          <Property Type="Guid" Name="SettingGUID" Nullable="false" />
          <Property Type="Guid" Name="TermGUID" />
          <Property Type="String" Name="SettingCode" Nullable="false" MaxLength="128" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="SettingDescriptionTR_TR" MaxLength="256" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="SettingDescriptionEN_US" MaxLength="256" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="SettingValueTR_TR" MaxLength="1024" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="SettingValueEN_US" MaxLength="1024" FixedLength="false" Unicode="true" />
</EntityType>
...
...


Görüldüğü gibi nvarchar tipli alanların boyutları ve nullable tanım kontolleri entity framework tarafında sürekli kontrol ediliyor. Bu tip güncellemeler de bu durumu unutmamak gerekmekte ve .edmx dosyasını da güncellemek gerekmektedir.

Ancak isterseniz bu tip validation'ları şu şekilde iptal edebiliyoruz:

...
...

dbContext.Configuration.ValidateOnSaveEnabled = false; // false yaparsak sql tipindeki boyut kontrolünü ef yapmaz, sql tarafına bırakır.
result = dbContext.SaveChanges();
...
...


Kaynaklar:
http://blogs.msdn.com/b/adonet/archive/2011/03/29/ef-4-1-rtw-change-to-default-maxlength-in-code-first.aspx
http://social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/thread/5f223d59-fb07-40d6-8cf8-737197fcae9f
http://stackoverflow.com/questions/5400530/validation-failed-for-one-or-more-entities-while-saving-changes-to-sql-server-da







Hiç yorum yok: