Entity Framework : 기본 키가없는 테이블
EF4.0을 사용하여 새 앱을 빌드하려는 기존 DB가 있습니다.
일부 테이블에는 기본 키가 정의되어 있지 않으므로 새 엔티티 데이터 모델을 작성할 때 다음 메시지가 표시됩니다. "테이블 / 뷰 TABLE_NAME에 기본 키가 정의되어 있지 않으며 유효한 기본 키를 유추 할 수 없습니다.이 테이블 / 엔터티를 사용하려면 스키마를 검토하고 올바른 키를 추가 한 후 주석 처리를 제거해야합니다. "
그것들을 사용하고 데이터를 수정하고 싶다면 반드시 그 테이블에 PK를 추가해야합니까? 아니면 해결 방법이 있습니까?
오류는 정확히 말한 것을 의미합니다.
이 문제를 해결할 수 있다고하더라도 나를 믿지 마십시오. 도입 될 수있는 혼란스러운 버그의 수는 놀랍고 무섭습니다. 성능이 튜브를 떨어 뜨릴 수 있다는 사실은 말할 것도 없습니다.
이 문제를 해결하지 마십시오. 데이터 모델을 수정하십시오.
편집 : 나는 많은 사람들 이이 질문을 내리는 것을 보았습니다. 괜찮습니다.하지만 OP 는 뷰가 아닌 기본 키가없는 테이블 매핑에 대해 물었습니다 . 대답은 여전히 같습니다. EF가 테이블에 PK를 보유해야 할 필요성을 해결하는 것은 관리 효율성, 데이터 무결성 및 성능 측면에서 나쁜 생각입니다.
일부는 타사 응용 프로그램에 매핑하기 때문에 기본 데이터 모델을 수정하는 기능이 없다고 언급했습니다. 모델이 아래에서 바뀔 수 있기 때문에 좋은 생각이 아닙니다. 아마도이 경우에는 OP에 요청한 것이 아닌 뷰에 매핑하고 싶을 것입니다.
나는 이것이 Tillito에 의해 해결되었다고 생각합니다.
아래에 그의 항목을 인용하겠습니다.
우리는 같은 문제가 있었고 이것이 해결책입니다.
엔티티 프레임 워크가 열을 기본 키로 사용하도록하려면 ISNULL을 사용하십시오.
엔티티 프레임 워크가 열을 기본 키로 사용하지 않도록하려면 NULLIF를 사용하십시오.
이것을 적용하는 쉬운 방법은 뷰의 select 문을 다른 select로 감싸는 것입니다.
예:
SELECT
ISNULL(MyPrimaryID,-999) MyPrimaryID,
NULLIF(AnotherProperty,'') AnotherProperty
FROM ( ... ) AS temp
생성 26 apr. 102012-04-26 17:00 : Tillito
그것들을 사용하고 데이터를 수정하고 싶다면 반드시 그 테이블에 PK를 추가해야합니까? 아니면 해결 방법이 있습니까?
이 질문에 도달하고 Entity Framework Core를 사용하는 사용자는 더 이상 해당 테이블에 PK를 추가하거나 해결 방법을 수행 할 필요가 없습니다. EF Core 2.1부터 새로운 기능인 쿼리 유형이 있습니다.
다음에 쿼리 유형을 사용해야합니다.
- 임시 FromSql () 쿼리의 반환 유형으로 사용됩니다.
- 데이터베이스 뷰에 매핑
- 기본 키가 정의되지 않은 테이블에 매핑
- 모델에 정의 된 쿼리에 매핑
그래서 DbContext 단지 유형의 다음과 같은 속성을 추가 DbQuery<T>
하는 대신 DbSet<T>
아래처럼. 테이블 이름을 가정하면 MyTable
:
public DbQuery<MyTable> MyTables { get; set; }
Entity Framework Fluent API를 사용하여 복합 키를 수행 할 수도 있습니다.
public class MyModelConfiguration : EntityTypeConfiguration<MyModel>
{
public MyModelConfiguration()
{
ToTable("MY_MODEL_TABLE");
HasKey(x => new { x.SourceId, x.StartDate, x.EndDate, x.GmsDate });
...
}
}
필자의 경우 엔터티를 기본 키가없는 View에 매핑해야했습니다. 또한이보기를 수정할 수 없었습니다. 다행히이 뷰에는 고유 한 문자열 인 열이있었습니다. 내 솔루션은이 열을 기본 키로 표시하는 것이 었습니다.
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[StringLength(255)]
public string UserSID { get; set; }
속이는 EF. 완벽하게 작동했지만 아무도 눈치 채지 못했습니다 ... :)
이 솔루션 작동
PK가 없어도 수동으로 매핑 할 필요는 없습니다. 열 중 하나가 색인이고 색인 열이 널 입력 가능하지 않다는 것을 EF에 알려 주면됩니다.
이렇게하려면 다음과 같이 isNull 함수를 사용하여 뷰에 행 번호를 추가 할 수 있습니다
select
ISNULL(ROW_NUMBER() OVER (ORDER BY xxx), - 9999) AS id
from a
ISNULL(id, number)
이 열이 기본 키가 될 수 있음을 EF에 알려주기 때문에 여기서 핵심 사항입니다.
EF는 데이터베이스에 기본 키가 필요하지 않습니다. 그렇다면 엔터티를 뷰에 바인딩 할 수 없습니다.
You can modify the SSDL (and the CSDL) to specify a unique field as your primary key. If you don't have a unique field, then I believe you are hosed. But you really should have a unique field (and a PK), otherwise you are going to run into problems later.
Erick
The above answers are correct if you really don't have a PK.
But if there is one but it is just not specified with an index in the DB, and you can't change the DB (yes, i work in Dilbert's world) you can manually map the field(s) to be the key.
Having a useless identity key is pointless at times. I find if the ID isn't used, why add it? However, Entity is not so forgiving about it, so adding an ID field would be best. Even in the case it's not used, it's better than dealing with Entity's incessive errors about the missing identity key.
This is just an addition to @Erick T's answer. If there is no single column with unique values, the workaround is to use a composite key, as follows:
[Key]
[Column("LAST_NAME", Order = 1)]
public string LastName { get; set; }
[Key]
[Column("FIRST_NAME", Order = 2)]
public string FirstName { get; set; }
Again, this is just a workaround. The real solution is to fix the data model.
- Change the Table structure and add a Primary Column. Update the Model
- Modify the .EDMX file in XML Editor and try adding a New Column under tag for this specific table (WILL NOT WORK)
- Instead of creating a new Primary Column to Exiting table, I will make a composite key by involving all the existing columns (WORKED)
Entity Framework: Adding DataTable with no Primary Key to Entity Model.
This maybe to late to reply...however...
If a table does't have a primary key then there are few scenarios that need to be analyzed in order to make the EF work properly. The rule is: EF will work with tables/classes with primary key. That is how it does tracking...
Say, your table 1. Records are unique: the uniqueness is made by a single foreign key column: 2. Records are unique: the uniqueness are made by a combination of multiple columns. 3. Records are not unique (for the most part*).
For scenarios #1 and #2 you can add the following line to DbContext module OnModelCreating method: modelBuilder.Entity().HasKey(x => new { x.column_a, x.column_b }); // as many columns as it takes to make records unique.
For the scenario #3 you can still use the above solution (#1 + #2) after you study the table (*what makes all records unique anyway). If you must have include ALL columns to make all records unique then you may want to add a primary key column to your table. If this table is from a 3rd party vendor than clone this table to your local database (overnight or as many time you needed) with primary key column added arbitrary through your clone script.
From a practical standpoint, every table--even a denormalized table like a warehouse table--should have a primary key. Or, failing that, it should at least have a unique, non-nullable index.
Without some kind of unique key, duplicate records can (and will) appear in the table, which is very problematic both for ORM layers and also for basic comprehension of the data. A table that has duplicate records is probably a symptom of bad design.
At the very least, the table should at least have an identity column. Adding an auto-generating ID column takes about 2 minutes in SQL Server and 5 minutes in Oracle. For that extra bit of effort, many, many problems will be avoided.
We encountered this problem as well, and while we had a column that had nulls, what was important was that we had a dependent column that did not have nulls and that the combination of these two columns was unique.
So to quote the response given by Pratap Reddy, it worked fine for us.
I`m very happy my problem is solved.
and do this : Look below that line and find the tag. It will have a big ol' select statement in it. Remove the tag and it's contents..
now without changing DB T I can insert to a table which has not PK
thanks all and thank Pharylon
The table just needs to have one column that does not allow nulls
참고URL : https://stackoverflow.com/questions/3996782/entity-framework-table-without-primary-key
'Programing' 카테고리의 다른 글
정적 확장 방법 (0) | 2020.06.06 |
---|---|
Node.js에서 비동기 함수의 긴 중첩을 피하는 방법 (0) | 2020.06.06 |
C ++ 라이브러리 및 프레임 워크가 스마트 포인터를 사용하지 않는 이유는 무엇입니까? (0) | 2020.06.06 |
activerecord로 마지막 N 레코드를 얻는 방법은 무엇입니까? (0) | 2020.06.05 |
이 날과 나이에 코드 파일에 최대 80 자 너비를 적용해야하는 유효한 이유가 있습니까? (0) | 2020.06.05 |