2

私は EF5 Code First を使用しており、IPAddress オブジェクトを格納しようとしています。これを直接実行しようとすると、EF はそれを FIELDNAME_Address と FIELDNAME_Scope の 2 つの列として格納します。残念ながら、ScopeId にアクセスすると例外がスローされるため、これは IPv4 アドレスの格納には不十分です ( C# 参照されているオブジェクトのタイプでは、試行された操作はサポートされていません を参照してください)。

私ができるようにしたいのは、型が EF でどのようにマップされるかを定義することですが、それを行う方法や、その用語が何であるかはわかりません。これは最もクリーンなソリューションであり、POCO を純粋な状態に保つことができます。

public class TestRecord 
{
    public int Id { get; set; }
    public IPAddress IP { get; set; }
}

OnModelCreating で何かを使用して、IPAddress オブジェクトをシリアル化および非シリアル化する方法を説明します。

私が検討した別のオプションは、ラッパー フィールドを使用することです。

public class TestRecord 
{
    public int Id { get; set; }
    public long value_ip { get; set; }
    [NotMapped]
    public IPAddress IP 
    { 
        get { return value_ip.ToIPAddress(); }
        set { value_ip = value.ToLong(); 
    } 
} 

残念ながら、これには、フィールドを public にするか、private フィールドをマップするために式をいじる必要があります。いずれにせよ、Context レベルで「これが IPAddress タイプを格納する方法です」と定義できるほどクリーンではありません。これは私の推奨するソリューションです。

4

1 に答える 1

2

EF は、シリアル化/逆シリアル化、カスタム型マッピング、またはマップ型変換をサポートしていません。複合型を使用してその型内で何らかの方法で処理するか、ラップされたフィールドを使用する必要があります (複合型はラップされたフィールドも使用します)。

于 2012-08-21T10:51:51.010 に答える