Можно ли использовать дженерики в отображении LINQ-to-SQL? - PullRequest
2 голосов
/ 14 сентября 2010

Есть ли способ определить следующую структуру в файле DataContext / DBML?

public class Entity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public EntitySet<IPermission> Permissions { get; set; }
}

public class User : IPermissionHolder
{
    public int Id { get; set; }
    public string Name { get; set; }
    public EntitySet<Permission<User>> Permissions { get; set; }
}

public class Group : IPermissionHolder
{
    public int Id { get; set; }
    public string Name { get; set; }
    public EntitySet<Permission<Group>> Permissions { get; set; }
}

public interface IPermissionHolder
{
    int Id { get; set; }
}

public interface IPermission
{
    Entity Entity { get; set; }
    IPermissionHolder Holder { get; }
}

public class Permission<T> : IPermission where T : class, IPermissionHolder 
{
    public IPermissionHolder Holder
    {
        get { return PermissionHolder; }
    }

    public T PermissionHolder { get; set; }
    public Entity Entity { get; set; }
}

Если это невозможно, можете ли вы предложить другую структуру, которая соответствует моим потребностям?

Правильнотеперь моя БД использует две разные таблицы для GroupPermissions и UserPermissions.
Мне не нравится иметь общую таблицу, в которой мне нужно добавить столбец типа "... с двумя разными таблицами, у меня гораздо большестрогий контроль на стороне БД.

Спасибо за любую помощь

PS: я все еще с Framework 3.5, в противном случае я мог бы удалить интерфейс IPermissionHolder и использовать co-variance

PSS: здесь также спрашивают, но ответа нет :( http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/04a03c68-79c0-4136-907c-f81440e78c45

РЕДАКТИРОВАТЬ: Я пробую разные вещи, и я сталкиваюсь с двумя основными проблемами 1) Я хочу иметьIEnumerable, но он никогда не будет работать, потому что я не хочу только получать данные, но также выдвигать данные, и объект не может быть одновременно ковариантным и контравариантным.Поэтому прежде всего я должен выбрать: читать или писать.2) Здесь самый трудный вопрос: как мне сопоставить ДВА ассоциации с одним свойством?
Пользователь:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name = "User_Permission", Storage = "permissions", ThisKey = "Id", OtherKey = "UserId")]
        public EntitySet<Permission<User>> Permissions{ ... }

Группа

[global::System.Data.Linq.Mapping.AssociationAttribute(Name = "Group_Permission", Storage = "permissions", ThisKey = "Id", OtherKey = "GroupId")]
public EntitySet<Permission<Group>> Permissions { ... }

Разрешение

   [global::System.Data.Linq.Mapping.AssociationAttribute(Name = "???", Storage = "holder", ThisKey = "HolderId", OtherKey = "Id", IsForeignKey = true)]
        public T PermissionHolder { ... }

Может быть, я должен назвать Ассоциацию "Holder_Permission"?!?

1 Ответ

0 голосов
/ 01 октября 2010

Я пробовал с разным подходом.Я могу сказать, что с LINQ-TO-SQL невозможно иметь общее отображение.

Я попробую с Linq-To-Entity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...