- 3,715,500 Users
- 2,242,776 Discussions
- 7,845,368 Comments
Forum Stats
Discussions
Categories
- 15 Data
- 362.2K Big Data Appliance
- 6 Data Science
- 1.5K Databases
- 461 General Database Discussions
- 3.7K Java and JavaScript in the Database
- 22 Multilingual Engine
- 487 MySQL Community Space
- 3 NoSQL Database
- 7.6K Oracle Database Express Edition (XE)
- 2.8K ORDS, SODA & JSON in the Database
- 416 SQLcl
- 42 SQL Developer Data Modeler
- 184.8K SQL & PL/SQL
- 21K SQL Developer
- 1.8K Development
- 3 Developer Projects
- 32 Programming Languages
- 135.1K Development Tools
- 8 DevOps
- 3K QA/Testing
- 246 Java
- 5 Java Learning Subscription
- 10 Database Connectivity
- 66 Java Community Process
- 1 Java 25
- 9 Java APIs
- 141.1K Java Development Tools
- 6 Java EE (Java Enterprise Edition)
- 153K Java Essentials
- 135 Java 8 Questions
- 86.2K Java Programming
- 270 Java Lambda MOOC
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 10 Java SE
- 13.8K Java Security
- 3 Java User Groups
- 22 JavaScript - Nashorn
- 18 Programs
- 124 LiveLabs
- 30 Workshops
- 9 Software
- 3 Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 3 Deutsche Oracle Community
- 10 Español
- 1.9K Japanese
- 2 Portuguese
EF Core 3.1 Beta OracleException: ORA-01460

Adding an image and saving the context ORA-01460 occurs.
DB-Set in Model:
public class Picture
{
public int PictureID { get; set; }
public byte[] Bild { get; set; }
public DateTime Ludsys { get; set; }
public int OrderDetailID { get; set; }
public OrderDetail OrderDetail { get; set; } // Navigationseigenschaft
} // Picture
Table in DB:
If I load the image and save it with SQL-Developer it can be read and displayed in the application.
Create the picture:
...
picture = new Picture
{
Bild = null,
Ludsys = DateTime.Now,
OrderDetail = orderdetail
}; // picture
imgBild.DataContext = picture;
imgBild.Source = FileToBitmapImage(dlg.FileName); // Bild aus Filesystem laden und anzeigen
context.Pictures.Add(picture);
pictures.Add(picture);
ind = pictures.Count - 1; // Index für den neuen Datensatz ist pictures.Count - 1
...
private BitmapImage FileToBitmapImage(string source)
{
try
{
if (source == string.Empty) { return null; }
BitmapImage bitmapimage = new BitmapImage();
using FileStream filestream = File.Open(source, FileMode.Open);
bitmapimage.BeginInit();
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.StreamSource = filestream;
bitmapimage.EndInit();
return bitmapimage;
} // try
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Nachricht", MessageBoxButton.OK, MessageBoxImage.Error);
return null;
} // catch
} // FileToBitmapImage
ImageConverter:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
try
{
if (value == null) { return null; }
byte[] byteArray = (byte[])value;
using MemoryStream memorystream = new MemoryStream(byteArray);
BitmapImage bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.StreamSource = memorystream;
bitmapimage.EndInit();
return bitmapimage;
} // try
catch (Exception)
{
return null;
} // catch
} // Convert
// ConvertBack (Ziel -> Quelle)
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
try
{
if (value == null) { return null; }
ImageSource imagesource = (ImageSource)value;
BitmapSource bitmapsource = imagesource as BitmapSource;
BitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapsource));
using MemoryStream ms = new MemoryStream();
encoder.Save(ms);
byte[] bytearray = ms.ToArray();
return bytearray;
} // try
catch (Exception)
{
return null;
} // catch
} // ConvertBack
Best Answer
-
Have you tried the HasMaxLength on the Bild property, not the ProductName?
modelBuilder.Entity<Picture>().Property(p => p.Bild).HasMaxLength(6000000);
It should work with the HasMaxLength, but without the HasColumnType.
Answers
-
Did you add the required Fluent API (i.e. HasMaxLength(x > 2000)) so that ODP.NET EF Core can map a byte[] to a BLOB?
-
My fluent API looks like this:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Default - Schema: HR
modelBuilder.HasDefaultSchema("HR");
// Customer-Configuration
modelBuilder.Entity<Customer>().Property(c => c.CompanyName).HasColumnType("varchar2");
modelBuilder.Entity<Customer>().Property(c => c.CompanyName).HasMaxLength(40);
modelBuilder.Entity<Customer>().Property(c => c.Ludsys).IsConcurrencyToken();
// Order-Configuration
modelBuilder.Entity<Order>().Property(o => o.Ludsys).IsConcurrencyToken();
// OrderDetail-Configuration
modelBuilder.Entity<OrderDetail>().Property(od => od.Ludsys).IsConcurrencyToken();
// Product-Configuration
modelBuilder.Entity<Product>().Property(p => p.ProductName).HasColumnType("varchar2");
modelBuilder.Entity<Product>().Property(p => p.ProductName).HasMaxLength(40);
modelBuilder.Entity<Product>().Property(p => p.Ludsys).IsConcurrencyToken();
// Picture-Configuration
modelBuilder.Entity<Picture>().Property(p => p.Bild).HasColumnType("blob");
modelBuilder.Entity<Product>().Property(p => p.ProductName).HasMaxLength(6000000); // 6MB
modelBuilder.Entity<Picture>().Property(p => p.Ludsys).IsConcurrencyToken();
// Beziehungen der DbSets untereinander
modelBuilder.Entity<Customer>().HasMany(c => c.Orders).WithOne(o => o.Customer);
modelBuilder.Entity<Order>().HasMany(o => o.OrderDetails).WithOne(od => od.Order);
modelBuilder.Entity<OrderDetail>().HasMany(od => od.Pictures).WithOne(p => p.OrderDetail);
modelBuilder.Entity<Product>().HasMany(p => p.OrderDetails).WithOne(od => od.Product);
} // OnModelCreating
-
Have you tried adding the required HasMaxLength(x > 2000) Fluent API to the following line:
modelBuilder.Entity<Picture>().Property(p => p.Bild).HasColumnType("blob");
This Fluent API is required as per the documentation.
-
I tried 3 variants:
only: modelBuilder.Entity<Picture>().Property(p => p.Bild).HasColumnType("blob");
only: modelBuilder.Entity<Product>().Property(p => p.ProductName).HasMaxLength(6000000); // 6MB
both: modelBuilder.Entity<Picture>().Property(p => p.Bild).HasColumnType("blob");
modelBuilder.Entity<Product>().Property(p => p.ProductName).HasMaxLength(6000000); // 6MB
I get always: ORA-01460
-
Have you tried the HasMaxLength on the Bild property, not the ProductName?
modelBuilder.Entity<Picture>().Property(p => p.Bild).HasMaxLength(6000000);
It should work with the HasMaxLength, but without the HasColumnType.
-
Hallo Alex,
thank you very much for your help. Only the following property is necessary.
modelBuilder.Entity<Picture>().Property(p => p.Bild).HasMaxLength(6000000);
I did much copy and paste to resolve the problem, so that I didn't see the wrong columnname "productname".
Now all is working pretty .
With kind regards! Günter Hoormann
-
Hi Gunter,
Glad to hear it works for you. Which DB version are you using?
My team hadn't seen this error before when we tested similar scenarios.
-
Hallo Alex,
I use DB-Version as below to create my Test-DB:
BANNER
-------------------------------------------------------------------
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
BANNER_FULL
-------------------------------------------------------------------
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
BANNER_LEGACY
-------------------------------------------------------------------
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
I created the DB by application in VisualStudio 2019 using the following nuget-packages:
DB looks like this:
I tested EF Core 3.1 using packages:
Actual Fluent-API:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Default - Schema: HR
modelBuilder.HasDefaultSchema("HR");
// Customer-Configuration
modelBuilder.Entity<Customer>().Property(c => c.CompanyName).HasMaxLength(40);
modelBuilder.Entity<Customer>().Property(c => c.Ludsys).IsConcurrencyToken();
// Order-Configuration
modelBuilder.Entity<Order>().Property(o => o.Ludsys).IsConcurrencyToken();
// OrderDetail-Configuration
modelBuilder.Entity<OrderDetail>().Property(od => od.Ludsys).IsConcurrencyToken();
// Product-Configuration
modelBuilder.Entity<Product>().Property(p => p.ProductName).HasMaxLength(40);
modelBuilder.Entity<Product>().Property(p => p.Ludsys).IsConcurrencyToken();
//Picture - Configuration
modelBuilder.Entity<Picture>().Property(p => p.Bild).HasMaxLength(6000000); // 6MB
modelBuilder.Entity<Picture>().Property(p => p.Ludsys).IsConcurrencyToken();
// Beziehungen der DbSets untereinander
modelBuilder.Entity<Customer>().HasMany(c => c.Orders).WithOne(o => o.Customer);
modelBuilder.Entity<Order>().HasMany(o => o.OrderDetails).WithOne(od => od.Order);
modelBuilder.Entity<OrderDetail>().HasMany(od => od.Pictures).WithOne(p => p.OrderDetail);
modelBuilder.Entity<Product>().HasMany(p => p.OrderDetails).WithOne(od => od.Product);
} // OnModelCreating
For ludsys column I created some trigger like this:
-- Customers
create or replace trigger trg_Customers_Ludsys
before insert or update on "Customers"
for each row
begin
:new."Ludsys" := sysdate;
end trg_Customers_Ludsys;
/
I hope this will help you.
Günter