2010-09-14 87 views
2

有没有办法在DataContext/DBML文件中定义以下结构?是否可以在LINQ-to-SQL映射中使用泛型?

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:我还是用框架3.5,否则我可以删除IPermissionHolder界面,并使用协方差

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 { ... } 

也许我应该叫Asscoiation “Holder_Permission”?!?

+0

您是否考虑过像数据访问一样使用数据库对象,并使用一些简单的CLR对象来管理这些更复杂的情况? – 2010-09-14 13:43:37

+0

嗨,恩瑞克,你能更精确吗?我不明白你的意思。 – bonfo 2010-09-14 14:40:51

回答

0

我尝试过很多不同的方法。我可以说,与LINQ-TO-SQL不可能有通用映射。

我会尝试与Linq-To-Entity。

相关问题