Есть ли способ определить следующую структуру в файле 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"?!?