이 모델들을 EF7에서 표현할 수 있습니까?

c# entity-framework-core

문제

내 자신의 프로젝트에서 다른 어셈블리의 일부 클래스를 EF7을 사용하여 유지할 수있는 엔티티로 사용하려고합니다. 데이터베이스와 매우 유사한 일련의 클래스를 작성하는 것이 아닙니다.

간체 버전은 다음과 같습니다.

interface IMediaFile
{
    string Uri { get; }
    string Title { get; set; }
}
class CMediaFile : IMediaFile
{
    public CMediaFile() { }
    public string Uri { get; set; }
    public string Title { get; set; }
}

//The following types are in my project and have full control over.
interface IPlaylistEntry
{
    IMediaFile MediaFile { get; }
}
class CPlaylistEntry<T> : IPlaylistEntry where T : IMediaFile
{
    public CPlaylistEntry() { }
    public T MediaFile { get; set; }
}

IMediaFile의 구현이 여러 개 있습니다. 단 하나만 보여주고 있습니다. My PlaylistEntry 클래스는 다양한 구현에 대해 다양한 특성을 사용할 수 있도록 일반 인수를 사용하며 IPlaylistEntry를 사용합니다.

그래서 저는 그것을 이렇게 모델링하기 시작했습니다 :

interface IMediaFile
{
    string Uri { get; }
    string Title { get; set; }
}
class CMediaFile : IMediaFile
{
    public CMediaFile() { }
    public string Uri { get; set; }
    public string Title { get; set; }
}

//The following types are in my project and have full control over.
interface IPlaylistEntry
{
    IMediaFile MediaFile { get; }
}
class CPlaylistEntry<T> : IPlaylistEntry where T : IMediaFile
{
    public CPlaylistEntry() { }
    public T MediaFile { get; set; }
}

간단한 테스트로서 CPlaylistEntry <>를 무시하고 다음을 수행합니다.

interface IMediaFile
{
    string Uri { get; }
    string Title { get; set; }
}
class CMediaFile : IMediaFile
{
    public CMediaFile() { }
    public string Uri { get; set; }
    public string Title { get; set; }
}

//The following types are in my project and have full control over.
interface IPlaylistEntry
{
    IMediaFile MediaFile { get; }
}
class CPlaylistEntry<T> : IPlaylistEntry where T : IMediaFile
{
    public CPlaylistEntry() { }
    public T MediaFile { get; set; }
}

이것은 던졌습니다 :

NotSupportedException : 엔터티 형식 'CPlaylistEntry'의 'MediaFile'에 값이 설정되어 있지 않으며 'CMediaFile'유형의 속성에 대해 값 생성기를 사용할 수 없습니다. 엔터티를 추가하기 전에 속성 값을 설정하거나 'CMediaFile'유형의 속성에 대해 값 생성기를 구성하십시오.

이 예외도 이해할 수 없으며, CMediaFile 엔티티 만 저장할 때 CPlaylistEntry가 표시되는 이유를 알지 못합니다. 필자는이 모델이 내 모델 정의와 관련이 있다고 추측합니다. CPlaylistEntry의 기본 키는 단순한 유형이 아니라 복잡한 유형 인 다른 엔티티로 정의됩니다. 그러나 나는 EF가 현명하기를 기대한다. 왜냐하면 복잡한 타입은 이미 선언 된 고유 한 프라이 머리 키를 가지고 있고 그 타입에 대한 외래 키로 그 프로퍼티를 선언했기 때문이다.

EF에서 이러한 클래스를 모델링 할 수 있습니까? 예를 들어 해당 데이터베이스 테이블이 무엇이 될 수 있는지를 근본적으로 재 설계하지 않아도됩니까? 이전에는 EF6 데이터베이스로 작업 했었습니다. 따라서 이것이 코드 우선 패턴에 대한 첫 번째 시도였습니다. 데이터베이스가 내 모델 정의처럼 보이게하는 혼란을 분리 할 수 ​​있기를 정말로 바라고 있습니다. .NET에서 상호 작용하는 "깨끗한"클래스를 유지하십시오.

이러한 유형과 그 관계에 대한 더 자세한 설명이 필요하면 질문하십시오.이 간략한 내용을 유지하려고합니다.

수락 된 답변

현재이 기능이 지원되는지는 의심 스럽습니다 (최종 버전인지 여부는 확실하지 않습니다). 약간의 변경으로 모델을 다시 만들려고했지만 데이터베이스를 만들 때 다음과 같은 결과가 나타납니다.

System.NotSupportedException : 'PlaylistEntry`1MediaFile'속성이 현재 지원되지 않는 'MediaFile'유형이므로 매핑 할 수 없습니다.

업데이트 1

MediaFile을 핵심 요소로 삼고 있다는 사실 때문에 문제가 발생한다고 생각합니다. 모델을 약간 변경했습니다. 당신의 목적에 부정적으로 작용하지 않을 것이기를 바랍니다.

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

매핑 :

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

용법:

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

이렇게하면 올바른 데이터가 데이터베이스에 저장됩니다.

다음을 사용하여 데이터를 검색 할 수 있습니다.

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

업데이트 2

ID를 키로 사용하고 싶지 않으므로 PlaylistEntry와 MediaFile 간의 관계에 사용될 Uri 속성을 재생 목록 클래스에 추가 할 수 있습니다.

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

이 경우의 매핑은 다음과 같습니다.

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

데이터를 삽입하는 용도는 동일하게 유지됩니다.

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

위의 코드는 외부 키로 사용되므로 PlaylistEntry Uri 속성에 "관련 없음"을 넣습니다.

데이터 검색 :

public interface IPlaylistEntry<T>
    where T : IMediaFile
{
    T MediaFile { get; set; }
}

public class PlaylistEntry<T> : IPlaylistEntry<T>
    where T : IMediaFile
{
    public int Id { get; set; }
    public string PlaylistInfo { get; set; } //added for testing purposes
    public T MediaFile { get; set; }
}

조인은 두 테이블의 Uri 필드에서 _ 생합니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.