5

EF5と.NET4.5を使用しています。データベースで誤って生成されている特定のクラスが1つあります。私のウェブサイトでは少し複雑ですが、簡単にします。

namespace Store.Enities
{
    public enum Role
    { Manager, Clerk }

    public class User
    {
        public int Id {get; set;}
        public ICollection<Role> Roles {get; set;}
    }

    public class StoreContext : DbContext
    {
        public DbSet<User> Users {get; set;}

        public StoreContext()
        {
            Database.SetIntializer(new DropCreateDatabaseIfModelChanges<StoreContext>());
        }
    }
}

ご覧のとおり、ユーザーは複数の役割を持つことができます。何らかの理由で、データベースにロールを保存することができません。

4

3 に答える 3

10

列挙型はまだプリミティブ型、特に整数です。UserクラスがICollection<int>データベース内の何かにマップするを持つことができないのと同じように、列挙型のコレクションを持つこともできません。

Role次のようなクラスを定義する必要があります。

public class Role
{
    public int Id {get; set;}
    public Roles Role {get; set;}
}

そして、列挙型の名前をRoles(または以外のものRole)に変更します。

于 2013-02-24T14:31:49.687 に答える
6

私はまだWindowsXPSP3を実行しているので、.NET Framework 4.5をインストールできず、何が問題なのかを確認するためのテストを実行できませんが、推測できます。あなたのデザインでは、各「ユーザー」はゼロから多数の「ロール」を持つことができます。これで、慣例により、Entity Frameworkは「ユーザー」を参照するために「ロール」に外部キーを生成しますが、「ロール」は複雑なオブジェクトである列挙であるため(値オブジェクト)エンティティフレームワークはこの状況をサポートしていません。「エンティティフレームワークはエンティティタイプに複合型のコレクションを含めることをサポートしていません」。ロールをエンティティにしてIDを指定する必要があります。私が正しいことを確認するために、1対1の関係を作成してみてください(各ユーザーには1つの役割しかありません)。それが機能した場合は、私は正しいです。

于 2013-02-24T00:03:37.063 に答える
1

Gert Amoldの回答に基づいて、暗黙の演算子を使用して、優れたラッパークラスを作成できます。

public class RoleWrapper
{
    public int Id { get; set; }

    // Role is any Enum
    public Role Role { get; set; }

    public static implicit operator Role(RoleWrapper val)
    {
        return val.Role;
    }
    public static implicit operator RoleWrapper(Role val)
    {
        return new RoleWrapper() { Role = val };
    }
}

このようにして、primitiv列挙型Roleでコレクションを使用できます。

myUser.Roles.Add(Role.WhateverRole);
Role firstRole = myUser.Roles[0];
于 2016-06-08T15:24:08.253 に答える