Entity Framework Core: FK with Different DataType than PK
Runtime: netcoreapp2.0
ASP.Net Core: 2.0.1
EF Core: 2.0.1
Microsoft.EntityFrameworkCore.SqlServer: 2.0.1
So, I'm working on an old database that is being used by lots of services and the original creators defined the PK of one table as short and a FK to that table as an int. Is it at all possible for me to handle this case?
Note: it is not feasible to change the column type at this time.
Consider the two classes:
public class Database
public short DatabaseId get; set;
public Database get; set;
public class Client
public int ClientId get; set;
public int DatabaseId get; set;
public Database Database get; set;
My first attempt:
public int DatabaseId get; set;
[ForeignKey("DatabaseId")] public Database Database get; set;
throws
System.InvalidOperationException: The relationship from 'Client.Database' to 'Database.Client' with foreign key properties 'DatabaseId' : int cannot target the primary key 'DatabaseId' : short because it is not compatible. Configure a principal key or a set of compatible foreign key properties for this relationship.
Using the fluent API now:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.DatabaseID);
);
Attempting to define a shadow property failed
modelBuilder.Entity<Client>(table =>
table.Property<int>("DatabaseId");
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey("DatabaseId")
.HasPrincipalKey<Database>(d => d.DatabaseId);
);
throws
System.InvalidOperationException: You are configuring a relationship between 'Client' and 'Database' but have specified a foreign key on 'DatabaseId'. The foreign key must be defined on a type that is part of the relationship.
Okay, so no shadow properties this time:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.SQLDatabaseID);
);
throws
System.InvalidOperationException: The types of the properties specified for the foreign key 'DatabaseId' on entity type 'Client' do not match the types of the properties in the principal key 'DatabaseID' on entity type 'Database'.
So, then I tried just changing the entity type and maybe EF will be able to map int to int16.
public class Client
public int ClientId get; set;
public short DatabaseId get; set; // <-- now a short
public Database Database get; set;
throws
System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'.
I'm starting to get the feeling this is not possible.
c# entity-framework-core
|
show 1 more comment
Runtime: netcoreapp2.0
ASP.Net Core: 2.0.1
EF Core: 2.0.1
Microsoft.EntityFrameworkCore.SqlServer: 2.0.1
So, I'm working on an old database that is being used by lots of services and the original creators defined the PK of one table as short and a FK to that table as an int. Is it at all possible for me to handle this case?
Note: it is not feasible to change the column type at this time.
Consider the two classes:
public class Database
public short DatabaseId get; set;
public Database get; set;
public class Client
public int ClientId get; set;
public int DatabaseId get; set;
public Database Database get; set;
My first attempt:
public int DatabaseId get; set;
[ForeignKey("DatabaseId")] public Database Database get; set;
throws
System.InvalidOperationException: The relationship from 'Client.Database' to 'Database.Client' with foreign key properties 'DatabaseId' : int cannot target the primary key 'DatabaseId' : short because it is not compatible. Configure a principal key or a set of compatible foreign key properties for this relationship.
Using the fluent API now:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.DatabaseID);
);
Attempting to define a shadow property failed
modelBuilder.Entity<Client>(table =>
table.Property<int>("DatabaseId");
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey("DatabaseId")
.HasPrincipalKey<Database>(d => d.DatabaseId);
);
throws
System.InvalidOperationException: You are configuring a relationship between 'Client' and 'Database' but have specified a foreign key on 'DatabaseId'. The foreign key must be defined on a type that is part of the relationship.
Okay, so no shadow properties this time:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.SQLDatabaseID);
);
throws
System.InvalidOperationException: The types of the properties specified for the foreign key 'DatabaseId' on entity type 'Client' do not match the types of the properties in the principal key 'DatabaseID' on entity type 'Database'.
So, then I tried just changing the entity type and maybe EF will be able to map int to int16.
public class Client
public int ClientId get; set;
public short DatabaseId get; set; // <-- now a short
public Database Database get; set;
throws
System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'.
I'm starting to get the feeling this is not possible.
c# entity-framework-core
So... what would happen if you had a row with idshort.MaxValue + 1
? How would EF map that toshort
? How would you store the value on the database? Can you change the database?
– Camilo Terevinto
Feb 26 '18 at 23:26
Damn thats a dousy not sure what they where thinking when making an Id a short. But If its impossible to change the schema you can convert your Identifiers to ToString() while executing linq queries(dirty un-maintainable fix). You can also explicitly convert by casting ex Convert.ToInt16(int.MaxValue);
– Mohamoud Mohamed
Feb 26 '18 at 23:29
I am still trying to figure why in gods name you would use a SHORT
– mvermef
Feb 27 '18 at 6:12
The problem isn't just executing simple queries which would be fine...The problem occurs when trying to follow the navigation properties e.g. _databases.Include(d => d.Client) EF can't follow the navigation property
– jaredcnance
Feb 27 '18 at 18:09
I have duplicated your attempt reference my comment on the answer below...
– mvermef
Feb 27 '18 at 23:26
|
show 1 more comment
Runtime: netcoreapp2.0
ASP.Net Core: 2.0.1
EF Core: 2.0.1
Microsoft.EntityFrameworkCore.SqlServer: 2.0.1
So, I'm working on an old database that is being used by lots of services and the original creators defined the PK of one table as short and a FK to that table as an int. Is it at all possible for me to handle this case?
Note: it is not feasible to change the column type at this time.
Consider the two classes:
public class Database
public short DatabaseId get; set;
public Database get; set;
public class Client
public int ClientId get; set;
public int DatabaseId get; set;
public Database Database get; set;
My first attempt:
public int DatabaseId get; set;
[ForeignKey("DatabaseId")] public Database Database get; set;
throws
System.InvalidOperationException: The relationship from 'Client.Database' to 'Database.Client' with foreign key properties 'DatabaseId' : int cannot target the primary key 'DatabaseId' : short because it is not compatible. Configure a principal key or a set of compatible foreign key properties for this relationship.
Using the fluent API now:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.DatabaseID);
);
Attempting to define a shadow property failed
modelBuilder.Entity<Client>(table =>
table.Property<int>("DatabaseId");
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey("DatabaseId")
.HasPrincipalKey<Database>(d => d.DatabaseId);
);
throws
System.InvalidOperationException: You are configuring a relationship between 'Client' and 'Database' but have specified a foreign key on 'DatabaseId'. The foreign key must be defined on a type that is part of the relationship.
Okay, so no shadow properties this time:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.SQLDatabaseID);
);
throws
System.InvalidOperationException: The types of the properties specified for the foreign key 'DatabaseId' on entity type 'Client' do not match the types of the properties in the principal key 'DatabaseID' on entity type 'Database'.
So, then I tried just changing the entity type and maybe EF will be able to map int to int16.
public class Client
public int ClientId get; set;
public short DatabaseId get; set; // <-- now a short
public Database Database get; set;
throws
System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'.
I'm starting to get the feeling this is not possible.
c# entity-framework-core
Runtime: netcoreapp2.0
ASP.Net Core: 2.0.1
EF Core: 2.0.1
Microsoft.EntityFrameworkCore.SqlServer: 2.0.1
So, I'm working on an old database that is being used by lots of services and the original creators defined the PK of one table as short and a FK to that table as an int. Is it at all possible for me to handle this case?
Note: it is not feasible to change the column type at this time.
Consider the two classes:
public class Database
public short DatabaseId get; set;
public Database get; set;
public class Client
public int ClientId get; set;
public int DatabaseId get; set;
public Database Database get; set;
My first attempt:
public int DatabaseId get; set;
[ForeignKey("DatabaseId")] public Database Database get; set;
throws
System.InvalidOperationException: The relationship from 'Client.Database' to 'Database.Client' with foreign key properties 'DatabaseId' : int cannot target the primary key 'DatabaseId' : short because it is not compatible. Configure a principal key or a set of compatible foreign key properties for this relationship.
Using the fluent API now:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.DatabaseID);
);
Attempting to define a shadow property failed
modelBuilder.Entity<Client>(table =>
table.Property<int>("DatabaseId");
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey("DatabaseId")
.HasPrincipalKey<Database>(d => d.DatabaseId);
);
throws
System.InvalidOperationException: You are configuring a relationship between 'Client' and 'Database' but have specified a foreign key on 'DatabaseId'. The foreign key must be defined on a type that is part of the relationship.
Okay, so no shadow properties this time:
modelBuilder.Entity<Client>(table =>
table.HasOne(p => p.Database)
.WithOne(i => i.Client)
.HasForeignKey<Client>(c => c.DatabaseId)
.HasPrincipalKey<Database>(d => d.SQLDatabaseID);
);
throws
System.InvalidOperationException: The types of the properties specified for the foreign key 'DatabaseId' on entity type 'Client' do not match the types of the properties in the principal key 'DatabaseID' on entity type 'Database'.
So, then I tried just changing the entity type and maybe EF will be able to map int to int16.
public class Client
public int ClientId get; set;
public short DatabaseId get; set; // <-- now a short
public Database Database get; set;
throws
System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'.
I'm starting to get the feeling this is not possible.
c# entity-framework-core
c# entity-framework-core
asked Feb 26 '18 at 23:13
jaredcnancejaredcnance
161112
161112
So... what would happen if you had a row with idshort.MaxValue + 1
? How would EF map that toshort
? How would you store the value on the database? Can you change the database?
– Camilo Terevinto
Feb 26 '18 at 23:26
Damn thats a dousy not sure what they where thinking when making an Id a short. But If its impossible to change the schema you can convert your Identifiers to ToString() while executing linq queries(dirty un-maintainable fix). You can also explicitly convert by casting ex Convert.ToInt16(int.MaxValue);
– Mohamoud Mohamed
Feb 26 '18 at 23:29
I am still trying to figure why in gods name you would use a SHORT
– mvermef
Feb 27 '18 at 6:12
The problem isn't just executing simple queries which would be fine...The problem occurs when trying to follow the navigation properties e.g. _databases.Include(d => d.Client) EF can't follow the navigation property
– jaredcnance
Feb 27 '18 at 18:09
I have duplicated your attempt reference my comment on the answer below...
– mvermef
Feb 27 '18 at 23:26
|
show 1 more comment
So... what would happen if you had a row with idshort.MaxValue + 1
? How would EF map that toshort
? How would you store the value on the database? Can you change the database?
– Camilo Terevinto
Feb 26 '18 at 23:26
Damn thats a dousy not sure what they where thinking when making an Id a short. But If its impossible to change the schema you can convert your Identifiers to ToString() while executing linq queries(dirty un-maintainable fix). You can also explicitly convert by casting ex Convert.ToInt16(int.MaxValue);
– Mohamoud Mohamed
Feb 26 '18 at 23:29
I am still trying to figure why in gods name you would use a SHORT
– mvermef
Feb 27 '18 at 6:12
The problem isn't just executing simple queries which would be fine...The problem occurs when trying to follow the navigation properties e.g. _databases.Include(d => d.Client) EF can't follow the navigation property
– jaredcnance
Feb 27 '18 at 18:09
I have duplicated your attempt reference my comment on the answer below...
– mvermef
Feb 27 '18 at 23:26
So... what would happen if you had a row with id
short.MaxValue + 1
? How would EF map that to short
? How would you store the value on the database? Can you change the database?– Camilo Terevinto
Feb 26 '18 at 23:26
So... what would happen if you had a row with id
short.MaxValue + 1
? How would EF map that to short
? How would you store the value on the database? Can you change the database?– Camilo Terevinto
Feb 26 '18 at 23:26
Damn thats a dousy not sure what they where thinking when making an Id a short. But If its impossible to change the schema you can convert your Identifiers to ToString() while executing linq queries(dirty un-maintainable fix). You can also explicitly convert by casting ex Convert.ToInt16(int.MaxValue);
– Mohamoud Mohamed
Feb 26 '18 at 23:29
Damn thats a dousy not sure what they where thinking when making an Id a short. But If its impossible to change the schema you can convert your Identifiers to ToString() while executing linq queries(dirty un-maintainable fix). You can also explicitly convert by casting ex Convert.ToInt16(int.MaxValue);
– Mohamoud Mohamed
Feb 26 '18 at 23:29
I am still trying to figure why in gods name you would use a SHORT
– mvermef
Feb 27 '18 at 6:12
I am still trying to figure why in gods name you would use a SHORT
– mvermef
Feb 27 '18 at 6:12
The problem isn't just executing simple queries which would be fine...The problem occurs when trying to follow the navigation properties e.g. _databases.Include(d => d.Client) EF can't follow the navigation property
– jaredcnance
Feb 27 '18 at 18:09
The problem isn't just executing simple queries which would be fine...The problem occurs when trying to follow the navigation properties e.g. _databases.Include(d => d.Client) EF can't follow the navigation property
– jaredcnance
Feb 27 '18 at 18:09
I have duplicated your attempt reference my comment on the answer below...
– mvermef
Feb 27 '18 at 23:26
I have duplicated your attempt reference my comment on the answer below...
– mvermef
Feb 27 '18 at 23:26
|
show 1 more comment
2 Answers
2
active
oldest
votes
In EF Core 2.1 you can use value conversions, i.e.
entityBuilder.Property(c => c.Id).HasConversion<string>();
where the generic string is the database type and the destination is the model type. You can read further on https://docs.microsoft.com/es-es/ef/core/modeling/value-conversions
add a comment |
You can bypass error generated by entity framework by using the following code to define your foreign key
[Column(TypeName = "int")]
public short DatabaseId get; set;
but once you run migrations you will get this error and this is generated by sql server.
Column 'Databases.DatabaseId' is not the same data type as referencing column 'Clients.DatabaseId' in foreign key 'FK_Clients_Databases_DatabaseId'.
And this makes perfect sense. What you are trying to achieve is not physically possible as SQL server requires foreign key to be same type otherwise you cannot build foreign key relationship.
I'm not concerned about migrations since the application I'm writing does not own the database. However, this still does not work and throws: System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'. I also tried going the other way and defining it as an int
– jaredcnance
Feb 27 '18 at 17:11
@jaredcnance it doesn't have anything to do with migrations it has everything to do with design. Your attempting to fit a Square Peg in a round HOLE. INT != SHORT in SQL SERVER, SHORT = SMALLINT, SMALLINT != INT in Sql Server. Truncation! EF is smart enough to know this... hence the error, and why ef core is rolling around on floor twitching..
– mvermef
Feb 27 '18 at 23:25
My comment about migrations was in response to the answer. I am aware that migrations is not the issue. I'm searching for a workaround to this problem because I cannot feasibly alter the database. Other applications depend on the current datatypes and would break if I altered the database. If this absolutely cannot be done, then fine I'll have to use Dapper or not use the navigation properties. My question is whether or not a workaround exists in EF Core.
– jaredcnance
Feb 28 '18 at 16:35
@jaredcnance you cannot do that physically, even Dapper will not work. and the end you will get exceptionforeign key is not of same type
this is only possible if you remove the relation between your tables and handle all foreign keys manually. If you remove the relation then joins will not work in normal way (you will also lose the navigation properties)
– Mujahid Daud Khan
Mar 1 '18 at 8:40
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f48998620%2fentity-framework-core-fk-with-different-datatype-than-pk%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
In EF Core 2.1 you can use value conversions, i.e.
entityBuilder.Property(c => c.Id).HasConversion<string>();
where the generic string is the database type and the destination is the model type. You can read further on https://docs.microsoft.com/es-es/ef/core/modeling/value-conversions
add a comment |
In EF Core 2.1 you can use value conversions, i.e.
entityBuilder.Property(c => c.Id).HasConversion<string>();
where the generic string is the database type and the destination is the model type. You can read further on https://docs.microsoft.com/es-es/ef/core/modeling/value-conversions
add a comment |
In EF Core 2.1 you can use value conversions, i.e.
entityBuilder.Property(c => c.Id).HasConversion<string>();
where the generic string is the database type and the destination is the model type. You can read further on https://docs.microsoft.com/es-es/ef/core/modeling/value-conversions
In EF Core 2.1 you can use value conversions, i.e.
entityBuilder.Property(c => c.Id).HasConversion<string>();
where the generic string is the database type and the destination is the model type. You can read further on https://docs.microsoft.com/es-es/ef/core/modeling/value-conversions
answered Nov 14 '18 at 15:05
Tomas Lopez RodriguezTomas Lopez Rodriguez
364
364
add a comment |
add a comment |
You can bypass error generated by entity framework by using the following code to define your foreign key
[Column(TypeName = "int")]
public short DatabaseId get; set;
but once you run migrations you will get this error and this is generated by sql server.
Column 'Databases.DatabaseId' is not the same data type as referencing column 'Clients.DatabaseId' in foreign key 'FK_Clients_Databases_DatabaseId'.
And this makes perfect sense. What you are trying to achieve is not physically possible as SQL server requires foreign key to be same type otherwise you cannot build foreign key relationship.
I'm not concerned about migrations since the application I'm writing does not own the database. However, this still does not work and throws: System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'. I also tried going the other way and defining it as an int
– jaredcnance
Feb 27 '18 at 17:11
@jaredcnance it doesn't have anything to do with migrations it has everything to do with design. Your attempting to fit a Square Peg in a round HOLE. INT != SHORT in SQL SERVER, SHORT = SMALLINT, SMALLINT != INT in Sql Server. Truncation! EF is smart enough to know this... hence the error, and why ef core is rolling around on floor twitching..
– mvermef
Feb 27 '18 at 23:25
My comment about migrations was in response to the answer. I am aware that migrations is not the issue. I'm searching for a workaround to this problem because I cannot feasibly alter the database. Other applications depend on the current datatypes and would break if I altered the database. If this absolutely cannot be done, then fine I'll have to use Dapper or not use the navigation properties. My question is whether or not a workaround exists in EF Core.
– jaredcnance
Feb 28 '18 at 16:35
@jaredcnance you cannot do that physically, even Dapper will not work. and the end you will get exceptionforeign key is not of same type
this is only possible if you remove the relation between your tables and handle all foreign keys manually. If you remove the relation then joins will not work in normal way (you will also lose the navigation properties)
– Mujahid Daud Khan
Mar 1 '18 at 8:40
add a comment |
You can bypass error generated by entity framework by using the following code to define your foreign key
[Column(TypeName = "int")]
public short DatabaseId get; set;
but once you run migrations you will get this error and this is generated by sql server.
Column 'Databases.DatabaseId' is not the same data type as referencing column 'Clients.DatabaseId' in foreign key 'FK_Clients_Databases_DatabaseId'.
And this makes perfect sense. What you are trying to achieve is not physically possible as SQL server requires foreign key to be same type otherwise you cannot build foreign key relationship.
I'm not concerned about migrations since the application I'm writing does not own the database. However, this still does not work and throws: System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'. I also tried going the other way and defining it as an int
– jaredcnance
Feb 27 '18 at 17:11
@jaredcnance it doesn't have anything to do with migrations it has everything to do with design. Your attempting to fit a Square Peg in a round HOLE. INT != SHORT in SQL SERVER, SHORT = SMALLINT, SMALLINT != INT in Sql Server. Truncation! EF is smart enough to know this... hence the error, and why ef core is rolling around on floor twitching..
– mvermef
Feb 27 '18 at 23:25
My comment about migrations was in response to the answer. I am aware that migrations is not the issue. I'm searching for a workaround to this problem because I cannot feasibly alter the database. Other applications depend on the current datatypes and would break if I altered the database. If this absolutely cannot be done, then fine I'll have to use Dapper or not use the navigation properties. My question is whether or not a workaround exists in EF Core.
– jaredcnance
Feb 28 '18 at 16:35
@jaredcnance you cannot do that physically, even Dapper will not work. and the end you will get exceptionforeign key is not of same type
this is only possible if you remove the relation between your tables and handle all foreign keys manually. If you remove the relation then joins will not work in normal way (you will also lose the navigation properties)
– Mujahid Daud Khan
Mar 1 '18 at 8:40
add a comment |
You can bypass error generated by entity framework by using the following code to define your foreign key
[Column(TypeName = "int")]
public short DatabaseId get; set;
but once you run migrations you will get this error and this is generated by sql server.
Column 'Databases.DatabaseId' is not the same data type as referencing column 'Clients.DatabaseId' in foreign key 'FK_Clients_Databases_DatabaseId'.
And this makes perfect sense. What you are trying to achieve is not physically possible as SQL server requires foreign key to be same type otherwise you cannot build foreign key relationship.
You can bypass error generated by entity framework by using the following code to define your foreign key
[Column(TypeName = "int")]
public short DatabaseId get; set;
but once you run migrations you will get this error and this is generated by sql server.
Column 'Databases.DatabaseId' is not the same data type as referencing column 'Clients.DatabaseId' in foreign key 'FK_Clients_Databases_DatabaseId'.
And this makes perfect sense. What you are trying to achieve is not physically possible as SQL server requires foreign key to be same type otherwise you cannot build foreign key relationship.
answered Feb 27 '18 at 5:53
Mujahid Daud KhanMujahid Daud Khan
1,160917
1,160917
I'm not concerned about migrations since the application I'm writing does not own the database. However, this still does not work and throws: System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'. I also tried going the other way and defining it as an int
– jaredcnance
Feb 27 '18 at 17:11
@jaredcnance it doesn't have anything to do with migrations it has everything to do with design. Your attempting to fit a Square Peg in a round HOLE. INT != SHORT in SQL SERVER, SHORT = SMALLINT, SMALLINT != INT in Sql Server. Truncation! EF is smart enough to know this... hence the error, and why ef core is rolling around on floor twitching..
– mvermef
Feb 27 '18 at 23:25
My comment about migrations was in response to the answer. I am aware that migrations is not the issue. I'm searching for a workaround to this problem because I cannot feasibly alter the database. Other applications depend on the current datatypes and would break if I altered the database. If this absolutely cannot be done, then fine I'll have to use Dapper or not use the navigation properties. My question is whether or not a workaround exists in EF Core.
– jaredcnance
Feb 28 '18 at 16:35
@jaredcnance you cannot do that physically, even Dapper will not work. and the end you will get exceptionforeign key is not of same type
this is only possible if you remove the relation between your tables and handle all foreign keys manually. If you remove the relation then joins will not work in normal way (you will also lose the navigation properties)
– Mujahid Daud Khan
Mar 1 '18 at 8:40
add a comment |
I'm not concerned about migrations since the application I'm writing does not own the database. However, this still does not work and throws: System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'. I also tried going the other way and defining it as an int
– jaredcnance
Feb 27 '18 at 17:11
@jaredcnance it doesn't have anything to do with migrations it has everything to do with design. Your attempting to fit a Square Peg in a round HOLE. INT != SHORT in SQL SERVER, SHORT = SMALLINT, SMALLINT != INT in Sql Server. Truncation! EF is smart enough to know this... hence the error, and why ef core is rolling around on floor twitching..
– mvermef
Feb 27 '18 at 23:25
My comment about migrations was in response to the answer. I am aware that migrations is not the issue. I'm searching for a workaround to this problem because I cannot feasibly alter the database. Other applications depend on the current datatypes and would break if I altered the database. If this absolutely cannot be done, then fine I'll have to use Dapper or not use the navigation properties. My question is whether or not a workaround exists in EF Core.
– jaredcnance
Feb 28 '18 at 16:35
@jaredcnance you cannot do that physically, even Dapper will not work. and the end you will get exceptionforeign key is not of same type
this is only possible if you remove the relation between your tables and handle all foreign keys manually. If you remove the relation then joins will not work in normal way (you will also lose the navigation properties)
– Mujahid Daud Khan
Mar 1 '18 at 8:40
I'm not concerned about migrations since the application I'm writing does not own the database. However, this still does not work and throws: System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'. I also tried going the other way and defining it as an int
– jaredcnance
Feb 27 '18 at 17:11
I'm not concerned about migrations since the application I'm writing does not own the database. However, this still does not work and throws: System.InvalidOperationException: An exception occurred while reading a database value for property 'Client.DatabaseId'. The expected type was 'System.Int16' but the actual value was of type 'System.Int32'. ---> System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Int16'. I also tried going the other way and defining it as an int
– jaredcnance
Feb 27 '18 at 17:11
@jaredcnance it doesn't have anything to do with migrations it has everything to do with design. Your attempting to fit a Square Peg in a round HOLE. INT != SHORT in SQL SERVER, SHORT = SMALLINT, SMALLINT != INT in Sql Server. Truncation! EF is smart enough to know this... hence the error, and why ef core is rolling around on floor twitching..
– mvermef
Feb 27 '18 at 23:25
@jaredcnance it doesn't have anything to do with migrations it has everything to do with design. Your attempting to fit a Square Peg in a round HOLE. INT != SHORT in SQL SERVER, SHORT = SMALLINT, SMALLINT != INT in Sql Server. Truncation! EF is smart enough to know this... hence the error, and why ef core is rolling around on floor twitching..
– mvermef
Feb 27 '18 at 23:25
My comment about migrations was in response to the answer. I am aware that migrations is not the issue. I'm searching for a workaround to this problem because I cannot feasibly alter the database. Other applications depend on the current datatypes and would break if I altered the database. If this absolutely cannot be done, then fine I'll have to use Dapper or not use the navigation properties. My question is whether or not a workaround exists in EF Core.
– jaredcnance
Feb 28 '18 at 16:35
My comment about migrations was in response to the answer. I am aware that migrations is not the issue. I'm searching for a workaround to this problem because I cannot feasibly alter the database. Other applications depend on the current datatypes and would break if I altered the database. If this absolutely cannot be done, then fine I'll have to use Dapper or not use the navigation properties. My question is whether or not a workaround exists in EF Core.
– jaredcnance
Feb 28 '18 at 16:35
@jaredcnance you cannot do that physically, even Dapper will not work. and the end you will get exception
foreign key is not of same type
this is only possible if you remove the relation between your tables and handle all foreign keys manually. If you remove the relation then joins will not work in normal way (you will also lose the navigation properties)– Mujahid Daud Khan
Mar 1 '18 at 8:40
@jaredcnance you cannot do that physically, even Dapper will not work. and the end you will get exception
foreign key is not of same type
this is only possible if you remove the relation between your tables and handle all foreign keys manually. If you remove the relation then joins will not work in normal way (you will also lose the navigation properties)– Mujahid Daud Khan
Mar 1 '18 at 8:40
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f48998620%2fentity-framework-core-fk-with-different-datatype-than-pk%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
So... what would happen if you had a row with id
short.MaxValue + 1
? How would EF map that toshort
? How would you store the value on the database? Can you change the database?– Camilo Terevinto
Feb 26 '18 at 23:26
Damn thats a dousy not sure what they where thinking when making an Id a short. But If its impossible to change the schema you can convert your Identifiers to ToString() while executing linq queries(dirty un-maintainable fix). You can also explicitly convert by casting ex Convert.ToInt16(int.MaxValue);
– Mohamoud Mohamed
Feb 26 '18 at 23:29
I am still trying to figure why in gods name you would use a SHORT
– mvermef
Feb 27 '18 at 6:12
The problem isn't just executing simple queries which would be fine...The problem occurs when trying to follow the navigation properties e.g. _databases.Include(d => d.Client) EF can't follow the navigation property
– jaredcnance
Feb 27 '18 at 18:09
I have duplicated your attempt reference my comment on the answer below...
– mvermef
Feb 27 '18 at 23:26