如何在 Linq 2 SQL 映射中定义类型?

Posted

技术标签:

【中文标题】如何在 Linq 2 SQL 映射中定义类型?【英文标题】:How do you define a type in a Linq 2 SQL mapping? 【发布时间】:2008-09-29 16:52:09 【问题描述】:

我正在尝试手动执行我的 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】:

我怀疑问题出在这里:

Member="AchievementTypeId"

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

例如,在 Northwind 中,链接 Customer 和 Order 显示(对于 Order):

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

SqlMetal 生成的代码有一些过于复杂的代码链接 CustomerID 和 Customer 属性。

【讨论】:

以上是关于如何在 Linq 2 SQL 映射中定义类型?的主要内容,如果未能解决你的问题,请参考以下文章

从 Money 到 Double 的 LINQ 到 SQL 映射

如何将 LINQ-to-SQL 映射到 BLL 类?

自定义 Linq-to-SQL 映射源

Entityframework 6:如何将自定义类型映射到 SQL 表

如何首先在EF代码中映射Sql server的文本字段类型? [复制]

通过 linq 到 xml 的复杂类型映射