2008-09-29 67 views
0

我试图做手工我的LINQ 2 SQL对象,所以我有以下代码:如何在Linq 2 SQL映射中定义一个类型?

var mapping = XmlMappingSource.FromXml(xml); 

using (DataContext ctx = new DataContext(conn_string, mapping)) 
{ 
    list = ctx.GetTable<Achievement>().ToList(); 
} 

和XML看起来是这样的:

<?xml version="1.0" encoding="utf-8" ?> 
<Database Name="FatFights" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"> 
    <Table Name="dbo.Achievements"> 
    <Type Name="FatFights.Business.Objects.Achievement"> 
     <Column Name="Id" Member="Id" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" /> 
     <Column Name="UserId" Member="UserId" /> 
     <Column Name="Achieved" Member="Achieved" /> 
     <Column Name="AchievementId" Member="AchievementTypeId" /> 
     <Association Name="AchievementType_Achievement" Member="AchievementTypeId" ThisKey="Id" OtherKey="Id" IsForeignKey="true" /> 
    </Type> 
    </Table> 
</Database> 

这将返回以下错误:

System.InvalidOperationException:无法在类型“Int32”上找到键“Id”的键成员“Id”。关键可能是错误的或'Int32'的字段或属性已更改名称..

所以我需要弄清楚如何告诉Linq 2 SQL,Id是GUID而不是Int32 ...所以我生成了一些Linq2SQL XML来查看它们是如何做到的,它们通过Type,但Type不是根据XSD的有效属性,因此失败。

下面是SQL表:

CREATE TABLE Achievements 
(
    Id    UNIQUEIDENTIFIER NOT NULL CONSTRAINT RG_Achievements ROWGUIDCOL 
                CONSTRAINT DF_Achievements_Id DEFAULT (NEWID()), 
    UserId   UNIQUEIDENTIFIER NOT NULL, 
    AchievementId INTEGER    NOT NULL, 
    Achieved  DATETIME   NOT NULL, 

    CONSTRAINT FK_Achievements_Users 
     FOREIGN KEY (UserId) 
     REFERENCES aspnet_Users (UserId), 

    CONSTRAINT FK_Achievements_AcheivementTypes 
     FOREIGN KEY (AchievementId) 
     REFERENCES AchievementTypes (Id), 

    CONSTRAINT PK_Achievements 
     PRIMARY KEY (Id), 

    CONSTRAINT UQ_Achievements_1 
     UNIQUE (UserId, AchievementId) 
) 

和业务对象:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace FatFights.Business.Objects 
{ 
    public class Achievement 
    { 
     public Guid Id { get; set; } 
     public Guid UserId { get; set; } 
     public int AchievementTypeId { get; set; } 
     public DateTime Achieved { get; set; } 
    } 
} 

回答

1

我怀疑问题就在这里:

会员= “AchievementTypeId”

对于一个关联,你应该链接一个类型化的成员 - 例如你可能有一个属性calle d“AchievementType”(类型为AchievementType),并且Member =“AchievementType”。

例如,在罗斯文,连接客户和订单示出了(用于顺序):

<Association Name="Customer_Order" Member="Customer" 
    ThisKey="CustomerID" OtherKey="CustomerID" 
    Type="Customer" IsForeignKey="true" /> 

的SqlMetal生成的代码然后有一些过于复杂代码链接在客户和客户性能。